Autor Tema: ejercicio java resuelto agencia viajes @Override compareTo implements Comparable  (Leído 2947 veces)

marclp96

  • Visitante
Hola, soy nulo en programacion Java y tengo un proyecto del cual tengo muchos problemas para concluir y dependo de aprobar el título. Si alguien pudiera ayudarme mandándome el proyecto, los códigos, cómo lo harían..., para poder comparar con el mío lo agradecería infinitamente. Les copio el enunciado para quien pueda ayudar:

*******************************

Enunciado:

1. Vas a realizar una aplicación para que una agencia de viajes pueda gestionar sus ofertas de visitas turísticas.

Cada visita siempre es dentro de un mismo país. De cada Visita deberás guardar: nombre de la visita, un vector con las ciudades que se visitan, país, precio por persona, extras, idioma, npersonas apuntadas y si es accesible para silla de ruedas o no.

Las visitas pueden ser de 2 tipos: Excursiones y Tours.

Una Excursion es una salida de un sólo día y deberá guardarse la fecha y hora de salida, la duración en horas y si incluye almuerzo o no.
Un Tour consiste en una visita de más de un día, por lo que habrá de incluir las fechas y horas de salida y de llegada, además del nombre de los hoteles donde se pernoctará en cada ciudad (vector en el mismo orden que el de ciudades).
Crea las tres clases, añadiendo todos los métodos que creas conveniente y por supuesto los toString().

2. La clase Mes contendrá un HashMap que guarde todas las visitas que la agencia prevea hacer en un mes (clave, el nombre). Además contendrá un atributo que guarde el nombre del mes a que se refiera.
Debe disponer de un método para añadir una visita y otro para borrar una visita dada la fecha de salida.
Otro método deberá imprimirlas por orden alfabético (usa un vector auxiliar). Otro, almorzar, que recibirá un parámetro de tipo boolean, permitirá poner en todas las excursiones de un día el atributo almuerzo a true o false, según el boolean recibido. Por último, un método cambiarHotel, cuyos parámetros serán: el nombre de un tour, una de sus ciudades y el nombre de un hotel. Deberá cambiar en ese tour y en esa ciudad el nombre del hotel antiguo por este nuevo que recibe.

3. Añade un último método a la clase Mes: exportar, que guardará en un archivo txt (cuyo nombre será “visitasTuristicasDelMesDe”+nombre del mes), cada visita en una linea. Primero debe escribir las excursiones y luego los tours.


*******************************

El primer párrafo ya lo tengo hecho, el de declarar las clases, los toString, etc. Donde me quedo bloqueado es en el segundo y en el de exportar a un archivo txt.

Muchas gracias a todos, de esto depende mi título :'(
« Última modificación: 19 de Agosto 2022, 19:12 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ayuda URGENTE: Ejercicio JAVA Agencia de viajes.
« Respuesta #1 en: 23 de Febrero 2022, 01:32 »
Hola.
Ya que no muestras como has hecho las clases del primer párrafo, te muestro como las haría yo. Todos modos tengo que escribirlas porque si no, no puedo avanzar con los siguientes párrafos.

Primero la clase Visita, con todos sus atributos y métodos.
La declaro como abstracta porque se entiende que no queremos construir objetos new Visita(), solo construiremos objetos de las clases hijas Excursiones y Tours.
No es obligatorio declararla abstracta, pero es una forma de impedir la creación de objetos Visita y además evidenciamos que es una clase destinada a ser "madre" de otras.
Código: [Seleccionar]
import java.util.Arrays;

public abstract class Visita {

private String nombre;
private String[] ciudades;
private String pais;
private double precioPersona;
private String extras;
private String idioma;
private int personasApuntadas;
private boolean accesible;

public Visita(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
int personasApuntadas, boolean accesible) {
this.nombre = nombre;
this.ciudades = ciudades;
this.pais = pais;
this.precioPersona = precioPersona;
this.extras = extras;
this.idioma = idioma;
this.personasApuntadas = personasApuntadas;
this.accesible = accesible;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String[] getCiudades() {
return ciudades;
}

public void setCiudades(String[] ciudades) {
this.ciudades = ciudades;
}

public String getPais() {
return pais;
}

public void setPais(String pais) {
this.pais = pais;
}

public double getPrecioPersona() {
return precioPersona;
}

public void setPrecioPersona(double precioPersona) {
this.precioPersona = precioPersona;
}

public String getExtras() {
return extras;
}

public void setExtras(String extras) {
this.extras = extras;
}

public String getIdioma() {
return idioma;
}

public void setIdioma(String idioma) {
this.idioma = idioma;
}

public int getPersonasApuntadas() {
return personasApuntadas;
}

public void setPersonasApuntadas(int personasApuntadas) {
this.personasApuntadas = personasApuntadas;
}

public boolean esAccesible() {
return accesible;
}

public void setAccesible(boolean accesible) {
this.accesible = accesible;
}

@Override
public String toString() {
return String.format(
"[nombre=%s, ciudades=%s, pais=%s, precioPersona=%.2f, extras=%s, idioma=%s, personasApuntadas=%d, accesible=%s",
nombre, Arrays.toString(ciudades), pais, precioPersona, extras, idioma, personasApuntadas, accesible?"SI":"No");
}

}

Aquí la clase hija Excursion. Su método toString() se complementa con lo que retorna el de su clase madre.
Código: [Seleccionar]
public class Excursion extends Visita {

private String fechaSalida;
private String horaSalida;
private int horasDura;
private boolean conAlmuerzo;

public Excursion(String nombre, String[] ciudades, String pais, double precioPersona, String extras,
String idioma, int personasApuntadas, boolean accesible, String fechaSalida, String horaSalida,
int horasDura, boolean conAlmuerzo) {
super(nombre, ciudades, pais, precioPersona, extras, idioma, personasApuntadas, accesible);
this.fechaSalida = fechaSalida;
this.horaSalida = horaSalida;
this.horasDura = horasDura;
this.conAlmuerzo = conAlmuerzo;
}

public String getFechaSalida() {
return fechaSalida;
}

public void setFechaSalida(String fechaSalida) {
this.fechaSalida = fechaSalida;
}

public String getHoraSalida() {
return horaSalida;
}

public void setHoraSalida(String horaSalida) {
this.horaSalida = horaSalida;
}

public int getHorasDura() {
return horasDura;
}

public void setHorasDura(int horasDura) {
this.horasDura = horasDura;
}

public boolean esConAlmuerzo() {
return conAlmuerzo;
}

public void setConAlmuerzo(boolean conAlmuerzo) {
this.conAlmuerzo = conAlmuerzo;
}

@Override
public String toString() {
return String.format("Excursion %s, fechaSalida=%s, horaSalida=%s, horasDura=%s, conAlmuerzo=%s]",
super.toString(), fechaSalida, horaSalida, horasDura, conAlmuerzo);
}

}

Y clase Tour
Código: [Seleccionar]
import java.util.Arrays;

public class Tour extends Visita {

private String fechaSalida;
private String horaSalida;
private String fechaLlegada;
private String horaLlegada;
private String[] hoteles;

public Tour(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
int personasApuntadas, boolean accesible, String fechaSalida, String horaSalida,
String fechaLlegada, String horaLlegada, String[] hoteles) {
super(nombre, ciudades, pais, precioPersona, extras, idioma, personasApuntadas, accesible);
this.fechaSalida = fechaSalida;
this.horaSalida = horaSalida;
this.fechaLlegada = fechaLlegada;
this.horaLlegada = horaLlegada;
this.hoteles = hoteles;
}

public String getFechaSalida() {
return fechaSalida;
}

public void setFechaSalida(String fechaSalida) {
this.fechaSalida = fechaSalida;
}

public String getHoraSalida() {
return horaSalida;
}

public void setHoraSalida(String horaSalida) {
this.horaSalida = horaSalida;
}

public String getFechaLlegada() {
return fechaLlegada;
}

public void setFechaLlegada(String fechaLlegada) {
this.fechaLlegada = fechaLlegada;
}

public String getHoraLlegada() {
return horaLlegada;
}

public void setHoraLlegada(String horaLlegada) {
this.horaLlegada = horaLlegada;
}

public String[] getHoteles() {
return hoteles;
}

public void setHoteles(String[] hoteles) {
this.hoteles = hoteles;
}

@Override
public String toString() {
return String.format("Tour %s, fechaSalida=%s, horaSalida=%s, fechaLlegada=%s, horaLlegada=%s, hoteles=%s]",
super.toString(), fechaSalida, horaSalida, fechaLlegada, horaLlegada, Arrays.toString(hoteles));
}

}

Luego sigo con el siguiente párrafo.
« Última modificación: 23 de Febrero 2022, 01:35 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ayuda URGENTE: Ejercicio JAVA Agencia de viajes.
« Respuesta #2 en: 23 de Febrero 2022, 02:02 »
Bien, siguiente parrafo.
La clase Mes nos dice que tiene dos atributos, un String con el nombre del mes que representa y un HashMap para albergar objetos de la clase Visita (es decir, Tours y Excursiones) y la clave para mapearlos será el nombre de la Visita, es decir, un String.

Bien, vayamos haciendolo paso a paso. Aquí comenzamos con los dos atributos, un constructor (al que yo le veo sentido que reciba el nombre del mes) y métodos get/set para el atributo String.
El HashMap, al menos en este caso, no tiene sentido que tenga también un get y/o set.

Código: [Seleccionar]
import java.util.HashMap;

public class Mes {

private HashMap<String, Visita> visitas;
private String nombreMes;

public Mes(String nombreMes) {
this.nombreMes = nombreMes;
visitas = new HashMap<String, Visita>();
}

public String getNombreMes() {
return nombreMes;
}

public void setNombreMes(String nombreMes) {
this.nombreMes = nombreMes;
}




}
Que dice a continuación:
Citar
Debe disponer de un método para añadir una visita y otro para borrar una visita dada la fecha de salida.

Bien, añadir una visita es fácil. Se usa su nombre como clave para mapear y listo.

Borrarla, según fecha, ya supone un código algo más elaborado.
Habrá que recorrer los valores del HashMap para buscar alguno que coinicida con la fecha de salida que se nos indique.
Como están guardados bajo el tipo Visita, y esta clase madre no tiene atributos de fecha, a cada valor habrá que preguntarle si es un Tour o una Excursion, hacer casting a la clase que le corresponda, y ahora sí podremos consultar su valor para el atributo fecha de salida.

Si encontramos alguno que coincida, pues lo fusilamos del HashMap..

Código: [Seleccionar]
public class Mes {

private HashMap<String, Visita> visitas;
private String nombreMes;

public Mes(String nombreMes) {
this.nombreMes = nombreMes;
visitas = new HashMap<String, Visita>();
}

public String getNombreMes() {
return nombreMes;
}

public void setNombreMes(String nombreMes) {
this.nombreMes = nombreMes;
}

public void addVisita(Visita visita) {
visitas.put(visita.getNombre(), visita);
}

public void borrarVisita(String fechaSalida) {
Visita borrar = null;
//Recorremos los valores del hashmap
for (Visita v: visitas.values()) {
/*
* Los objetos están guardados como Visita.
* Para poder consultar sus fechas de salida, hay
* que castearlos a Tour o Excursion, según corresponda
*/
if(v instanceof Excursion) { //Es una Excursion
Excursion ex = (Excursion) v; //Casting
if (ex.getFechaSalida().equals(fechaSalida)) {//¿Coincide la fecha de salida?
borrar = v; //Pues entonces esta es la que vamos borrar
break; //Dejamos de buscar
}
}
else  {//Si no es Excursion, pues es un Tour
Tour to = (Tour) v;
if (to.getFechaSalida().equals(fechaSalida)) {
borrar = to;
break;
}
}
}

//Tras recorrer los valores, comprobamos si hemos encontrado alguna visita para borrar
if (borrar == null)
System.out.println("No se ha encontrado ninguna visita para la fecha: " + fechaSalida);
else { //borrar tiene algún valor, es la Visita que hay que eliminar
visitas.remove(borrar.getNombre());//Indicamos clave para borrar
System.out.println("Se ha eliminado la Visita con el nombre: " + borrar.getNombre());
}


}


}

Siguiente petición :
Citar
Otro método deberá imprimirlas por orden alfabético (usa un vector auxiliar)
Bien, para esto habrá que extraer los valores del hashmap en una colección auxiliar y ordenarlos alfabéticamente por nombre..
Y para ordenarlos de forma más cómoda y eficiente, lo ideal sería enseñarle a la clase Visita cómo ha de comparar sus objetos para ordenarse como queremos.
Así que podemos modificar la clase Visita implementándole la interfaz Comparable y sobreescribiendo el método compareTo(), donde le diremos que para ordenarse hay que comparar los nombres de las visitas.
Marco en azul los cambios
Citar
public abstract class Visita implements Comparable<Visita> {
   
   private String nombre;
   private String[] ciudades;
   private String pais;
   private double precioPersona;
   private String extras;
   private String idioma;
   private int personasApuntadas;
   private boolean accesible;
   
   public Visita(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
         int personasApuntadas, boolean accesible) {
      this.nombre = nombre;
      this.ciudades = ciudades;
      this.pais = pais;
      this.precioPersona = precioPersona;
      this.extras = extras;
      this.idioma = idioma;
      this.personasApuntadas = personasApuntadas;
      this.accesible = accesible;
   }

   public String getNombre() {
      return nombre;
   }

   public void setNombre(String nombre) {
      this.nombre = nombre;
   }

   public String[] getCiudades() {
      return ciudades;
   }

   public void setCiudades(String[] ciudades) {
      this.ciudades = ciudades;
   }

   public String getPais() {
      return pais;
   }

   public void setPais(String pais) {
      this.pais = pais;
   }

   public double getPrecioPersona() {
      return precioPersona;
   }

   public void setPrecioPersona(double precioPersona) {
      this.precioPersona = precioPersona;
   }

   public String getExtras() {
      return extras;
   }

   public void setExtras(String extras) {
      this.extras = extras;
   }

   public String getIdioma() {
      return idioma;
   }

   public void setIdioma(String idioma) {
      this.idioma = idioma;
   }

   public int getPersonasApuntadas() {
      return personasApuntadas;
   }

   public void setPersonasApuntadas(int personasApuntadas) {
      this.personasApuntadas = personasApuntadas;
   }

   public boolean esAccesible() {
      return accesible;
   }

   public void setAccesible(boolean accesible) {
      this.accesible = accesible;
   }

   @Override
   public String toString() {
      return String.format(
            "[nombre=%s, ciudades=%s, pais=%s, precioPersona=%.2f, extras=%s, idioma=%s, personasApuntadas=%d, accesible=%s",
            nombre, Arrays.toString(ciudades), pais, precioPersona, extras, idioma, personasApuntadas, accesible?"SI":"No");
   }
   
   @Override
   public int compareTo(Visita otraVisita) {
      return nombre.compareTo(otraVisita.nombre);
   }

}

Con estos cambios, ahora en la clase Mes podemos escribir un método para imprimir la visitas en orden alfabético y usando muy poco código.
Podemos crear un array con los valores del HashMap, ordenarlo e imprimirlo.
Código: [Seleccionar]
public void imprimirOrdenadas() {
//Creamos array
Visita[] aux = new Visita[visitas.size()];

//Traspasamos las visitas al array
int i = 0;
for (Visita v: visitas.values()) {
aux[i] = v;
i++;
}

//Ordenamos array
Arrays.sort(aux);


//Imprimimos en pantalla, cada Visita se mostrará según su método toString()
for (Visita v: aux)
System.out.println(v);
}

Que más...
Citar
Otro, almorzar, que recibirá un parámetro de tipo boolean, permitirá poner en todas las excursiones de un día el atributo almuerzo a true o false, según el boolean recibido.
Mmmhh. no está muy bien redactado esto. Supongo que además del boolean, se ha de indicar la fecha de las excursiones que se quiere cambiar, ¿no?
Código: [Seleccionar]
public void almorzar(String fechaSalida, boolean conAlmuerzo) {
//Recorremos valores del map buscando Excursiones
for (Visita v: visitas.values()) {
if (v instanceof Excursion) {
Excursion ex = (Excursion) v;
if (ex.getFechaSalida().equals(fechaSalida))
ex.setConAlmuerzo(conAlmuerzo);
}
}
}

Para terminar el párrafo 2:
Citar
Por último, un método cambiarHotel, cuyos parámetros serán: el nombre de un tour, una de sus ciudades y el nombre de un hotel. Deberá cambiar en ese tour y en esa ciudad el nombre del hotel antiguo por este nuevo que recibe.

Bien con el nombre de la Visita, ya tenemos la clave para buscarla en el HashMap.
Una vez obtenida, comprobamos si realmente es un Tour y en ese caso le hacemos casting.
Una vez tenemos el Tour, obtenemos de este objeto los arrays de Hoteles y Ciudades.
Buscamos la ciudad indicada en el array, su posición nos dirá donde tenemos que insertar el nuevo nombre del hotel
Código: [Seleccionar]
public void cambiarHotel(String nombre, String ciudad, String hotel) {
//Buscamos la Visita/Tour, su nombre nos da la clave
Visita v = visitas.get(nombre);
//Comprobamos si se ha encontrado
if (v == null)
System.out.println("No se ha encontrado ninguna Visita con el nombre: " + nombre);
else {
//Visita encontrada, ahora comprobamos si realmente es un Tour
if (v instanceof Tour) { //Sí lo es
Tour t = (Tour) v;
//Obtenemos array de ciudades, para buscar la posicion que ocupa la ciudad indicada
//En esa misma posicion, habrá que cambiar el nombre en el array de hoteles
String[] ciudades = t.getCiudades();
String[] hoteles = t.getHoteles();
for (int i = 0; i < ciudades.length; i++) {
if (ciudades[i].equals(ciudad)) //ciudad encontrada
hoteles[i] = hotel; //Cambiamos hotel
}
}
else //No es Tour
System.out.println("El nombre de Visita indicado no corresponde a un Tour");
}
}

Y me quedé sin tiempo, mañana vemos el párrafo 3
« Última modificación: 23 de Febrero 2022, 10:37 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ayuda URGENTE: Ejercicio JAVA Agencia de viajes.
« Respuesta #3 en: 23 de Febrero 2022, 10:43 »
Párrafo 3.

Añadir a la clase Mes un método para exportar a txt:
Código: [Seleccionar]
public void exportar() {
File salida = new File("visitasTuristicasDelMesDe" + nombreMes + ".txt");
try {
BufferedWriter escritor = new BufferedWriter(new FileWriter(salida));
//Recorremos los valores del HashMap
for (Visita v: visitas.values()) {
escritor.write(v.toString());
escritor.newLine();
}
escritor.close();
} catch (IOException e) {
System.out.println("Error exportando las Visitas a txt:\n" + e.getMessage());
}
}

Y ahora quedaría probar el código escrito.
Creamos una clase main donde construimos un mes y le añadimos un par de Tours y un par de Visitas.
En este ejemplo, pruebo lo de mostrar en pantalla ordenado y lo de exportar a txt.
Todo parece funcionar bien.
Código: [Seleccionar]
public class Test {

public static void main(String[] args) {
//Creamos un mes
Mes febrero = new Mes("Febrero");
//Añadimos un par de Excursiones
febrero.addVisita(new Excursion("Sur de Francia", new String[] {"Leucate", "Gruisan"},
"Francia", 45, "Visita Parque Natural Narbonaise", "Frances", 15, false, "15/02/2022",
"09:45", 12, true));
febrero.addVisita(new Excursion("Costa Cantabra", new String[] {"Santoña", "Santander"},
"España", 363, "Vista Palacio de la Magdalena", "Español", 25, true, "21/02/2022",
"09:30", 8, false));
//Y un par de Tours
febrero.addVisita(new Tour("Ruta Portuguesa",
new String[] {"Braga", "Oporto", "Ovar", "Agueda", "Coimbra", "Lisboa"}, "Portugal", 65,
"Paseo en barco por Rio Duero", "Portugues", 8, true, "19/02/2022", "09:00", "24/02/2022",
"20:00", new String[] {"La Braganza", "O portico", "Ovar Hilton", "Santa Agueda",
"El Coimbrano", "Lisbon HR"}));
febrero.addVisita(new Tour("Al-Andalus",
new String[] {"Sevilla", "Cadiz", "Marbella", "Motril", "Almeria",}, "España", 50,
"Excursion por el Parque Natural Los Alcornocales", "Español", 12, false, "01/02/2022", "09:00",
"05/02/2022", "18:00", new String[] {"Sevilla Hilton", "El Gaditano", "Marbella City",
"Hotel Alhambra", "Reino Almeria"}));

//Probamos a listarlos ordenados en pantalla
febrero.imprimirOrdenadas();

//Y exportamos a txt
febrero.exportar();

}

}

Quedaría probar los otros métodos de cambiar hotel o eliminar una visita por fecha.
Esto ya lo dejo en tus manos.

Pregunta lo que no entiendas.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".