121
Aprender a programar desde cero / Re: Ayuda con este ejercicio please
« en: 26 de Octubre 2022, 13:36 »
Si ejecutas tu código, verás que no salen agrupados por ubicación.
La idea sería que primero se mostrasen por ejemplo los eventos Gold y el precio de cada evento. El precio se podría mostrar completo, con el impuesto y el descuento, que puede variar según si es temporada alta o baja.
Luego, lo mismo con los Platinum y por último los VIP.
Esto lo podríamos hacer con tres bucles, o tres métodos, donde cada uno se ocupe de mostrar los eventos de una ubicación concreta.
Pero si previamente ordenamos los eventos por ubicación, podremos hacerlo con un único bucle.
Para ordenarlos así, a la clase MisComparadores podemos añadir un nuevo Comparator, el cuál simplemente tiene que retornar el resultado de comparar el carácter que representa el código de ubicación de los eventos.
Con este comparador, y sin necesidad de cambiar nada en la clase Evento ya podemos desarrollar la clase Prueba02 para que haga el listado.
Primero ordenaremos según ubicación.
Y luego al listar, haremos que el sistema detecte cuándo ha terminado con los eventos de una ubicación y va a comenzar con otros, para que lo muestre en pantalla.
Al ejecutarlo, en pantalla vemos como los eventos quedan visiblemente agrupados.
En los precios vemos que solo hay variedad en los Gold, porque uno es "temporada alta" y el otro no.
En los otros no hay variación porque resulta que los hemos creado bajo la misma temporada.
Opcionalmente, podemos modificar el código de creación de estos eventos para que no coincidan sus temporadas, y así reflejar más variedad en los precios.
Venga, que ya queda menos.
Sigue adelante con la siguiente prueba:
Solamente hacer una lista con los títulos de los eventos y el total recaudado.
El total recaudado sería el resultado de multiplicar el precio (monto - descuento) por la cantidad de asistentes a dicho evento. La cantidad de asistentes la sabemos por el tamaño que tenga el ArrayList, y esto nos lo dice su método size()
En este caso, si podrías hacer un nuevo método para la clase Evento que se ocupe de hacer el cálculo de la recaudación.
Un saludo.
La idea sería que primero se mostrasen por ejemplo los eventos Gold y el precio de cada evento. El precio se podría mostrar completo, con el impuesto y el descuento, que puede variar según si es temporada alta o baja.
Luego, lo mismo con los Platinum y por último los VIP.
Esto lo podríamos hacer con tres bucles, o tres métodos, donde cada uno se ocupe de mostrar los eventos de una ubicación concreta.
Pero si previamente ordenamos los eventos por ubicación, podremos hacerlo con un único bucle.
Para ordenarlos así, a la clase MisComparadores podemos añadir un nuevo Comparator, el cuál simplemente tiene que retornar el resultado de comparar el carácter que representa el código de ubicación de los eventos.
Citar
public class MisComparadores {
public static final Comparator<Evento> TITULO_EVENTO_DESCENDENTE = new Comparator<Evento>() {
@Override
public int compare(Evento evento1, Evento evento2) {
/*
* Los titulos son cadenas String.
* La clase String ya sabe como ha de compararse ella misma,
* así que podemos retornar directamente el resultado de
* comparar los títulos de los eventos.
* Sin embargo, por defecto, la comparación de la clase String
* nos daría un orden ASCENDENTE (de A a Z) y nosotros queremos
* un orden DESCENDENTE (de Z a A).
* Podemos revertir ese orden simplemente multiplicando por -1
* el resultado que da la comparación de la clase String
*/
return (evento1.getTitulo().compareTo(evento2.getTitulo())) * -1;
}
};
public static final Comparator<Evento> UBICACION_ASCENDENTE = new Comparator<Evento>() {
@Override
public int compare(Evento evento1, Evento evento2) {
return Character.compare(evento1.getCodigoUbicacion(), evento2.getCodigoUbicacion());
}
};
}
Con este comparador, y sin necesidad de cambiar nada en la clase Evento ya podemos desarrollar la clase Prueba02 para que haga el listado.
Primero ordenaremos según ubicación.
Y luego al listar, haremos que el sistema detecte cuándo ha terminado con los eventos de una ubicación y va a comenzar con otros, para que lo muestre en pantalla.
Código: [Seleccionar]
package pruebas;
import java.util.ArrayList;
import entidades.Evento;
import util.MisComparadores;
public class Prueba02 {
private static ArrayList<Evento> eventos = new ArrayList<Evento>();
public static void main(String[] args) {
//Agregamos eventos para pruebas
Evento.cargarDatosPruebas(eventos);
//Listar los Eventos
eventos.sort(MisComparadores.UBICACION_ASCENDENTE); //Ordenamos por ubicacion
System.out.println("\n\t\tLISTADO DE EVENTOS AGRUPADOS POR UBICACION");
char ubicacion = ' ';
for (Evento even: eventos) {
//Comprobamos si el evento actual es de distinta ubicacion, y por tanto comienza nuevo grupo
if (even.getCodigoUbicacion() != ubicacion) { //Ubicacion distinta
System.out.println(textoUbicacion(even.getCodigoUbicacion())); //Iniciamos nuevo grupo
ubicacion = even.getCodigoUbicacion(); //Actualizamos la ubicacion actual
}
//Mostramos datos del evento
System.out.printf("--> Titulo: %-35s --> Precio: %.2f\n",
even.getTitulo(), even.getMontoTotal() - even.getDescuento());
}
}
/*
* Devuelve un texto descriptivo para el codigo de ubicacion.
* Lo usaremos como cabecera para cada grupo de eventos.
*/
private static String textoUbicacion(char codigo) {
switch(codigo) {
case 'G':
return "\n\t---EVENTOS Gold---";
case 'P':
return "\n\t---EVENTOS Platinum---";
default:
return "\n\t---EVENTOS VIP---";
}
}
}
Al ejecutarlo, en pantalla vemos como los eventos quedan visiblemente agrupados.
Citar
LISTADO DE EVENTOS AGRUPADOS POR UBICACION
---EVENTOS Gold---
--> Titulo: Recuperacion Fauna Iberica --> Precio: 159,83
--> Titulo: Descifrando Codigo Ensamblador --> Precio: 168,71
---EVENTOS Platinum---
--> Titulo: Impacto Guerra Ucrania --> Precio: 265,77
--> Titulo: Presentacion Novela Historica --> Precio: 265,77
---EVENTOS VIP---
--> Titulo: Arte Textil Africano --> Precio: 106,49
--> Titulo: Nuevas Tecnicas Marketing --> Precio: 106,49
En los precios vemos que solo hay variedad en los Gold, porque uno es "temporada alta" y el otro no.
En los otros no hay variación porque resulta que los hemos creado bajo la misma temporada.
Opcionalmente, podemos modificar el código de creación de estos eventos para que no coincidan sus temporadas, y así reflejar más variedad en los precios.
Citar
LISTADO DE EVENTOS AGRUPADOS POR UBICACION
---EVENTOS Gold---
--> Titulo: Recuperacion Fauna Iberica --> Precio: 159,83
--> Titulo: Descifrando Codigo Ensamblador --> Precio: 168,71
---EVENTOS Platinum---
--> Titulo: Impacto Guerra Ucrania --> Precio: 265,77
--> Titulo: Presentacion Novela Historica --> Precio: 280,53
---EVENTOS VIP---
--> Titulo: Arte Textil Africano --> Precio: 106,49
--> Titulo: Nuevas Tecnicas Marketing --> Precio: 100,89
Venga, que ya queda menos.
Sigue adelante con la siguiente prueba:
Citar
clase Prueba03 que muestre la lista de eventos y el total recaudado por cada evento.Para esta prueba, no será necesario ordenar los eventos de ninguna manera.
Solamente hacer una lista con los títulos de los eventos y el total recaudado.
El total recaudado sería el resultado de multiplicar el precio (monto - descuento) por la cantidad de asistentes a dicho evento. La cantidad de asistentes la sabemos por el tamaño que tenga el ArrayList, y esto nos lo dice su método size()
En este caso, si podrías hacer un nuevo método para la clase Evento que se ocupe de hacer el cálculo de la recaudación.
Un saludo.