Autor Tema: java programa gestión eventos actividad ejercicio resuelto paso a paso ArrayList  (Leído 2461 veces)

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, necesitaría ayuda para resolver este ejercicio:

Se requiere un programa para el manejo de los eventos que se realizan en la institución. Un evento tiene nombre del evento, fecha de realización, organizador, facultad organizadora, tema del evento.

En el evento se compone de actividades. Toda actividad tiene nombre de la actividad, un expositor (que es la persona que la dicta), hora y número de participantes.

Los salones donde se lleva a cabo la actividad se corresponden con la posición en el arreglo de donde se guarda la información de la respectiva actividad.

El sistema debe permitir entre otros:

· Crear una actividad y validar que el salón asignado no esté ya asignado a otra actividad.

· En el programa principal debe haber un menú para la ejecución de las tareas.

· Hay que decir que actividad tuvo mayor cantidad de participantes

· Hay que decir que actividad tuvo la menor cantidad de participantes

· Mostrar el total de participantes a un evento

· Se deben crear dos eventos Tecnotic y Softhard (objeto)

· Ordenar las actividades de mayor a menor según cantidad de participantes.

· Dado el nombre de un expositor, decir en cuantas actividades ha estado y los nombres de las actividades.

· Mostrar toda la programación de un evento.
« Última modificación: 01 de Abril 2021, 12:05 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #1 en: 28 de Noviembre 2020, 00:19 »
Citar
Se requiere un programa para el manejo de los eventos que se realizan en la institución. Un evento tiene nombre del evento, fecha de realización, organizador, facultad organizadora, tema del evento.

En el evento se compone de actividades. Toda actividad tiene nombre de la actividad, un expositor (que es la persona que la dicta), hora y número de participantes.

De ese texto ya podemos deducir que habrán al menos dos clases: evento y actividades.
Y que entre ellas hay una relación de inclusión, es decir, un evento puede incluir n actividades

Comienza por escribir el código de esas clases, con sus atributos y métodos.
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #2 en: 28 de Noviembre 2020, 01:37 »
Soy un principiante y no tengo ni idea de cómo se empieza ¿me podrían ayudar para guiarme? Es que de verdad necesito la ayuda...
« Última modificación: 01 de Abril 2021, 11:22 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #3 en: 28 de Noviembre 2020, 12:00 »
Pero se supone que si te han pedido que resuelvas este ejercicio, es que previamente te han dado explicaciones, material de estudio y lo necesario para resolverlo, o al menos intentarlo.

A ver, el escenario que nos plantean es que hay una institución que organiza eventos
Para cada evento, se dispone de varios salones, en los que se llevan a cabo distintas actividades relacionadas con dicho evento.

Las palabras marcadas en negrita, son las principales "entidades" que participan en este escenario.
Estas entidades son las que tenemos que representar mediante código Java, normalmente creando una clase que las modele. Aunque no siempre va a ser necesario crear una clase, eso ya depende de cada caso y/o incluso decisión del programador.

Veamos la "entidad" Actividad, que nos dice el enunciado.
Citar
En el evento se compone de actividades. Toda actividad tiene nombre de la actividad, un expositor (que es la persona que la dicta), hora y número de participantes.
Nos enumera varias características, lo que normalmente llamamos atributos

Si queremos codificar todo esto, Sí vamos a necesitar crear una clase, que podría ser esta:
Código: [Seleccionar]
public class Actividad {

private String nombre;
private String expositor;//Persona que expone
private String hora;
private int participantes;

/*
* Constructor sin parámetros.
* Con esto nos aseguramos de que al construir
* un objeto Actividad, no tendremos atributos
* con valor null
*/
public Actividad() {
nombre = "";
expositor = "";
hora = "";
participantes = 0;
}

/*
* Constructor con parámetros.
* El objeto se construye recibiendo los valores
* que vamos a asignar a los atributos.
*/
public Actividad(String nombreActiv, String nombreExpos, String horaActiv, int numParticipan) {
nombre = nombreActiv;
expositor = nombreExpos;
hora = horaActiv;
participantes = numParticipan;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreActiv) {
nombre = nombreActiv;
}

public String getExpositor() {
return expositor;
}

public void setExpositor(String nombreExpos) {
expositor = nombreExpos;
}

public String getHora() {
return hora;
}

public void setHora(String horaActiv) {
hora = horaActiv;
}

public int getParticipantes() {
return participantes;
}

public void setParticipantes(int numParticipan) {
participantes = numParticipan;
}

}

Ahí tenemos una clase con los atributos indicados en el enunciado, constructores necesarios para crear objetos de esta clase y métodos para obtener y modificar los valores de los atributos.

Puede que luego mientras se desarrolla el programa, decidamos añadir algún método más, o tal vez no..., de momento tiene lo mínimo necesario.


Sigamos, a ver que nos dicen de las otras entidades:

Citar
Se requiere un programa para el manejo de los eventos que se realizan en la institución. Un evento tiene nombre del evento, fecha de realización, organizador, facultad organizadora, tema del evento.

En el evento se compone de actividades. Toda actividad tiene nombre de la actividad, un expositor (que es la persona que la dicta), hora y número de participantes.

Los salones donde se lleva a cabo la actividad se corresponden con la posición en el arreglo de donde se guarda la información de la respectiva actividad.

De los eventos nos dan una serie de atributos que hay que modelar con código.
También nos dice que los eventos contienen actividades, así que estas entidades tienen una relación de inclusión.
Es decir, un objeto Evento dentro va a contener uno o varios objetos Actividad.

Estas Actividades que va a contener, son también atributos de la clase Evento, y para contenerlas usaremos un arreglo.
Con todo esto, está más que claro que para Evento también habrá que escribir una clase.

De la entidad Salón no nos dan atributos, solo nos dice que cada salón se corresponde con una de las posiciones del arreglo perteneciente a un Evento.

Por lo tanto, no parece necesario escribir una clase para la entidad Salón. Se podría, pero no aportaría ninguna ventaja. Nos basta con entender que cada posición de los arreglos que contienen Actividades, equivalen a un Salón.

Vamos a ver como podría quedar la clase Evento.

Código: [Seleccionar]
public class Evento {

private String nombre;
private String fecha;
private String organizador;
private String facultad;
private String tema;

//Salones de Actividades
private Actividad[] salones;

public Evento() {
nombre = "";
fecha = "";
organizador = "";
facultad = "";
tema = "";
salones = new Actividad[0]; //Contructor por defecto implica tener 0 salones.
}

public Evento(String nombreEven, String fechaEven, String organizaEven,
String facultadEven, String temaEven, int numSalones) {
nombre = nombreEven;
fecha = fechaEven;
organizador = organizaEven;
facultad = facultadEven;
tema = temaEven;
salones = new Actividad[numSalones]; //Al construir un evento, nos dirán cuantos salones tendrá
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreEven) {
nombre = nombreEven;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fechaEven) {
fecha = fechaEven;
}

public String getOrganizador() {
return organizador;
}

public void setOrganizador(String organizaEven) {
organizador = organizaEven;
}

public String getFacultad() {
return facultad;
}

public void setFacultad(String facultadEven) {
facultad = facultadEven;
}

public String getTema() {
return tema;
}

public void setTema(String temaEven) {
tema = temaEven;
}

public void setNumSalones(int numSalones) {
salones = new Actividad[numSalones];
}

}

Ahí tenemos los atributos básicos y los métodos getter/setter para gestionarlos.
También tenemos el arreglo de Actividades, que representa los salones.

Fíjate que al ser un arreglo, se necesita proporcionarle un tamaño determinado para poder iniciarse.
Este tamaño se le puede dar mediante el constructor. Así cuando se crea un objeto Evento, ya se decide cuántos salones va a tener, y por tanto, cuántas Actividades va a poder contener.

Al final hay un método llamado setNumSalones() que permite reiniciar el arreglo de salones con un nuevo tamaño.
Hay que tener en cuenta que usarlo supone eliminar Actividades que se hubieran añadido previamente.
Para este programa, no parece que vayamos a tener que usar este método así que no importa demasiado, pero en el caso de que quisiéramos dar opción de usarlo, habría que advertir al usuario de lo que supone y pedirle confirmación.

Bueno, la clase Evento no está terminada. Falta por ejemplo un método para poder añadir Actividades. Y según se vaya avanzando en el desarrollo del programa, seguramente querremos añadirle más métodos que nos faciliten las tareas que nos piden.

Pero antes de seguir adelante, lee bien lo que llevamos escrito y asegúrate de que entiendes cada línea de código.
Lo que no entiendas, te parezca raro, o no estés de acuerdo... pregúntalo y lo aclaramos.
« Última modificación: 28 de Noviembre 2020, 12:03 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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #4 en: 28 de Noviembre 2020, 12:32 »
O sea, que hasta el momento solo se han realizado dos clases "Actividad y Evento" lo cual dices que no es nesesario una clase Salon?

¿Ya solo es hacer las funciones que pide el programa como tal

· Crear una actividad y validar que el salón asignado no esté ya asignado a otra actividad.

· En el programa principal debe haber un menú para la ejecución de las tareas.

· Hay que decir que actividad tuvo mayor cantidad de participantes

· Hay que decir que actividad tuvo la menor cantidad de participantes

· Mostrar el total de participantes a un evento

· Se deben crear dos eventos Tecnotic y Softhard (objeto)

· Ordenar las actividades de mayor a menor según cantidad de participantes.

· Dado el nombre de un expositor, decir en cuantas actividades ha estado y los nombres de las actividades.

· Mostrar toda la programación de un evento.
« Última modificación: 01 de Abril 2021, 11:23 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #5 en: 28 de Noviembre 2020, 23:52 »
Vamos a ir desarrollándolo paso a paso.

Tenemos las clases principales, pero esto por si solo no funciona, no es un programa ejecutable.

Necesitamos otra clase, la clase "main" principal que hace que el programa se ejecute y será quien se encargue de mostrar un menú al usuario para que elija las tareas que quiere realizar.

Podemos comenzar creando el "esqueleto" de este menú. Vamos a mostrar en pantalla las opciones disponibles y dejar que el usuario elija la que quiera, pero las opciones aún no tendrán funcionalidad, estas las iremos añadiendo poco a poco.
De momento solo mostraremos el mensaje "En construcción..."

Pero ya sí tenemos un programa que podemos ejecutar, no hace gran cosa, pero se puede poner en marcha.

Sí vamos a poner ya como atributo global, un ArrayList donde se irán almacenando los Eventos que el usuario quiera crear.
Y un objeto Scanner para poder leer por teclado lo que el usuario quiera introducir.

Y también un método muy simple llamado pausa() que su función será detener la ejecución del programa hasta que se pulse la tecla ENTER.
De este modo, podemos "pausar" el programa para que el usuario lea los mensaje en pantalla y avanzar cuando él así lo decida.


De nuevo insisto en la importancia de que entiendas cada línea de código antes de seguir con los pasos siguientes.
Que no te queden dudas sobre cómo se comporta el bucle do..while() que estamos usando, o que hace el switch..., o por qué estamos usando un ArrayList para guardar Eventos y no estamos usando un arreglo primitivo "normal y corriente".

Pregunta lo que sea.

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

public class MenuEventos {

//Aquí se almacenarán los Eventos
private static ArrayList<Evento> eventos = new ArrayList<Evento>();
//Objeto Scanner para leer datos por teclado
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

String opcion = "";//Variable para recoger opcion del usuario

do {
System.out.println("\n\t\tMENU EVENTOS");
System.out.println("\t\t---- -------\n");
System.out.println("[1] - Crear nuevo EVENTO");
System.out.println("[2] - Crear nueva ACTIVIDAD");
System.out.println("[3] - Mostrar ACTIVIDAD con mayor número de participantes");
System.out.println("[4] - Mostrar ACTIVIDAD con menor número de participantes");
System.out.println("[5] - Mostrar total participantes de un EVENTO");
System.out.println("[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes");
System.out.println("[7] - Consultar ACTIVIDADES de un expositor");
System.out.println("[8] - Mostrar programación de un EVENTO");
System.out.println("\n[0] - SALIR del programa");
System.out.print("\nEscoja opción: ");
opcion = teclado.nextLine();
//Evaluamos opcion escogida
switch(opcion) {
case "0":
System.out.println("\n\t\t--FIN DE PROGRAMA--");
break;
case "1":
System.out.println("\nEn construccion...");
break;
case "2":
System.out.println("\nEn construccion...");
break;
case "3":
System.out.println("\nEn construccion...");
break;
case "4":
System.out.println("\nEn construccion...");
break;
case "5":
System.out.println("\nEn construccion...");
break;
case "6":
System.out.println("\nEn construccion...");
break;
case "7":
System.out.println("\nEn construccion...");
break;
case "8":
System.out.println("\nEn construccion...");
break;
default:
System.out.println("\nOpción no válida...");
}
pausa();
} while(!opcion.equals("0"));
}

/*
* Sencillo método que pausa la ejecución del programa
* hasta que el usuario pulse ENTER/INTRO
*/
private static void pausa() {
System.out.println("\nPulse ENTER para seguir...\n");
teclado.nextLine();
}

}
« Última modificación: 28 de Noviembre 2020, 23:55 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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #6 en: 29 de Noviembre 2020, 01:23 »
Hola hasta el momento voy entediento el código con los comentarios que entre líneas. Lo que no he entendido es el arrayslist o cual es la función de éste.
« Última modificación: 01 de Abril 2021, 11:25 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #7 en: 29 de Noviembre 2020, 01:47 »
hasta el momenton voy entediento el codigo con los comentarios que ahi entre lineas lo que no eh entendido por la que se importa el arrayslist o cual es la funcion de el??

Buena pregunta.

Un ArrayList, es muy parecido a un arreglo "normal".
Su utilidad es la misma: contener muchas variables u objetos, en un único objeto, y poder acceder a ellos usando un indice para señalar a cada uno de sus elementos.

Pero el ArrayList es más avanzado y tiene una diferencia fundamental: no tiene un tamaño fijo.

Un arreglo normal, cuando se inicia, hay que darle un tamaño y este no puede cambiar.
Si lo inicio dándole una longitud de 5 elementos, solo podrá contener eso: 5 elementos.
Es una colección estática, no podemos variar su tamaño.

En cambio un ArrayList se puede iniciar sin darle ningún tamaño fijo. Así que permite que podamos añadirle todos los elementos que queramos sin restricciones, su tamaño irá creciendo cuando añadamos elementos o disminuyendo cuando pidamos eliminarlos.
Es una colección dinámica, su tamaño se va ajustando según le entran o salen elementos.

Entonces, cuando queramos modelar una entidad que va a tener una cantidad de elementos fija, pues vamos a preferir usar un arreglo normal.
Es lo que hemos hecho con la clase Evento, porque hemos decidido que cada Evento va a tener un número de "salones" concreto, este número se decide mediante su constructor.

En cambio, en el programa principal, vamos a querer que el usuario pueda crear todos los Eventos que el quiera.
En el "mundo real", esta aplicación sería para gestionar los Eventos que se producen en una ciudad, o en una región, a lo largo de todo el año.
¿Cuántos Eventos podrían ser?... Pues no lo sabemos.., pueden ser decenas, o centenares...

Entonces, no nos interesa usar un arreglo "normal", porque voy a tener que darle un tamaño fijo. Si le doy tamaño de 200 por ejemplo, pues ese sería el límite de eventos.
Si resulta que a lo largo del año ocurren más de 200 eventos.., pues nuestra aplicación no sería capaz de gestionarlos todos si optamos por usar un arreglo normal.

En cambio, usando una colección dinámica como ArrayList (no es la única que existe en Java), no tendríamos ningún problema. Ningún evento quedaría fuera de nuestra aplicación, porque no hay límite para albergarlos.

Esa es la ventaja del ArrayList, no tiene tamaño fijo y nos interesará usarlo cuando nuestro programa tenga que gestionar una cantidad indeterminada de datos
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: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #8 en: 29 de Noviembre 2020, 01:49 »
Siguiente paso.

Una de las cosas que nos piden es crear dos eventos concretos: Tecnotic y Softhard.
El programa tendrá una opción para que el usuario pueda crear los Eventos que quiera, pero estos dos los vamos a dejar creados directamente en el código (lo que se llama hardcodear)
Esto permite que nada más arrancar el programa, ya tengamos dos eventos con los que poder trabajar.

Así que en la clase principal, añadimos este método:
Código: [Seleccionar]
/*
* Crearemos dos eventos via código para que el
* programa comience con algunos datos con los
* que trabajar
*/
private static void crearEventosPorDefecto() {

/*
* Recordamos que un evento tiene los atributos:
* nombre, fecha, organizador, facultad que organiza,
* temática y salones disponibles para actividades
*/
Evento tecnotic = new Evento("Tecnotic", "03/02/2021", "Ismael Clemente",
"MIT Club of Spain", "IA aplicada en operaciones bursátiles", 5);
Evento softhard = new Evento("Softhard", "14/03/2021", "ParqueSoft",
"Universidad Antonio Jose Camacho", "Software Libre en Seguridad Informática", 3);
//Eventos creados, los agregamos al ArrayList que los almacena
eventos.add(tecnotic);
eventos.add(softhard);
}

Y para que esto se ejecute nada más comenzar el programa, invocamos este método en al primera línea del método main()

Código: [Seleccionar]
public static void main(String[] args) {

crearEventosPorDefecto(); //Invocamos método que nos proporciona dos eventos.

String opcion = "";//Variable para recoger opcion del usuario

do {
System.out.println("\n\t\tMENU EVENTOS");
System.out.println("\t\t---- -------\n");
System.out.println("[1] - Crear nuevo EVENTO");
System.out.println("[2] - Crear nueva ACTIVIDAD");
..............

Como hemos dicho, ahora al arrancar el programa, ya tenemos dos Eventos.
Estos Eventos, no tienen Actividades todavía, ya crearemos más adelante el código necesario para añadir Actividades.

Pero lo que vamos a hacer ahora es activar la opción nº 8 de nuestro menú:
Mostrar programación de un EVENTO

Esta opción lo que ha de hacer es mostrar en pantalla los eventos disponibles para que el usuario pueda elegir de cuál quiere ver sus actividades programadas.

Para facilitar esta tarea, deberíamos "enseñarle" a la clase Evento cómo mostrar sus Actividades.
Y también deberíamos enseñarle a la clase Actividad, cómo queremos que muestre sus datos en pantalla.
Así cada clase se hace cargo de lo suyo.

Empecemos por Actividad. Vamos a querer que muestre en pantalla los datos de sus atributos: nombre, expositor, hora, etc..
Para esta necesidad, es habitual sobreescribir el método toString()

Este es un método que TODAS las clases Java heredan automáticamente, pero para que lo usen adecuadamente, hay que sobreescribirlo (Override).
La función de este método es retornar un String con los datos que consideramos representativos de la clase, en este caso, queremos que sean todos los atributos.
Así que eso es lo que haremos, construir un String con todos los datos de los atributos, un poquito formateados para que salgan en pantalla con un mínimo de elegancia.

A la clase Actividad, le añadimos este método:
Código: [Seleccionar]
@Override
public String toString() {
return "\n\t\t----------------\nNombre de ACTIVIDAD: " + nombre
+ "\nExpositor: " + expositor
+ "\nHora: " +  hora + "\nParticipantes: " + participantes
+ "\n\t\t----------------\n";
}

Con esto, Actividad ya sabe como ha de mostrarse en pantalla.
Ahora hay que enseñarle a Evento como mostrar su programación de actividades.

Para mostrar su programación, vamos a pedirle que recorra los "salones, es decir, el arreglo donde se asignan las Actividades y muestre en pantalla los datos de cada Actividad (que acabamos de enseñarle como ha de hacerlo)

Pero hay que tener en cuenta todas las posibilidades.
Es posible que el arreglo no tenga "salones" asignados, es decir, el arreglo este iniciado con "longitud igual a 0" porque se ha utilizado el constructor por defecto.

También es posible que Sí tenga "salones" asignados, pero no tenga ninguna Actividad programada.
De hecho, este es el caso de nuestro eventos Tecnotic y Softhard, tienen salones, pero no tienen actividades.
Esto lo sabremos si al recorrer todas las posiciones del arreglo buscando Actividades, solo encontramos valores null

Y la última posibilidad es que tenga salones y tenga actividades. Es decir, el arreglo tiene al menos un elemento que NO es null
Así que al recorrer el arreglo, por cada elemento primero preguntaremos si NO es null
Si NO lo es, significa que tiene Actividad programada y la mostraremos en pantalla.

Hay que tener en cuenta cada una de estas tres posibilidades y mostrar en pantalla los mensajes necesarios para explicar al usuario qué está ocurriendo en cada caso.

A la clase Evento, le añadimos este método para que sepa mostrar su programación:

Código: [Seleccionar]
public void mostrarProgramacion() {

//Es posible que no hayan salones asignados.
if (salones.length == 0)
System.out.println("\nEste EVENTO no tiene salones de ACTIVIDADES asignados");
else {
/*
* Sí hay salones asignados, pero puede que aun no hayan actividades.
* Si TODAS las posiciones del array de Actividad tienen valor null,
* es que no hay actividades programadas.
*/
boolean hayActividades = false;//Si encontramos al menos 1 actividad, pasará a true
for (int i = 0; i < salones.length; i++) {
if (salones[i] != null) {
hayActividades = true; //Sí que hay actividades programadas
System.out.println("\nNº de Salón: " + i);
System.out.println(salones[i]);//Mostramos datos de la Actividad
}
}
/*
* Terminado el bucle FOR, si la variable hayActividades
* conserva valor FALSE, es que no hay actividades
* programadas en este Evento y lo indicamos en pantalla.
*/
if (!hayActividades)
System.out.println("\nAún no se han programado ACTIVIDADES para este EVENTO");
}
}

Bien, lo siguiente es crear el código en la clase main para que el usuario pueda dar orden de consultar la programación de un Evento.
Como dijimos, la lógica a seguir será mostrar al usuario los eventos disponibles para que elija cuál quiera consultar, y al evento elegido le pediremos que muestre sus actividades.

En la clase principal, añadimos este método:
Código: [Seleccionar]
/*
* Muestra al usuario los Eventos disponibles para que
* elija uno y saldrá en pantalla sus Actividades programadas,
* si es que las tiene.
*/
private static void mostrarActividadesEvento() {
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

/*
* Con try catch, podemos capturar la posible
* excepción que podría ocurrir si el usuario
* nos da una posición que no existe en el ArrayList
* y así obraremos en consecuencia.
*/
try {
eventos.get(num).mostrarProgramacion();
} catch(IndexOutOfBoundsException ex) {
System.out.println("Selección equivocada...");
}
}

Y para que funcione, en el método main(), vamos al case 8 del switch, borramos la línea donde informábamos que estaba en construcción y añadimos una llamada a este nuevo método.

Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            System.out.println("\nEn construccion...");
            break;
         case "2":
            System.out.println("\nEn construccion...");
            break;
         case "3":
            System.out.println("\nEn construccion...");
            break;
         case "4":
            System.out.println("\nEn construccion...");
            break;
         case "5":
            System.out.println("\nEn construccion...");
            break;
         case "6":
            System.out.println("\nEn construccion...");
            break;
         case "7":
            System.out.println("\nEn construccion...");
            break;
         case "8":
            mostrarActividadesEvento();
            break;
         default:
            System.out.println("\nOpción no válida...");
         }

Y así ya tenemos la opción nº 8 funcionando, y podemos ver la programación de nuestros dos eventos. Aunque como ya hemos dicho, no hay nada programado todavía...

En pantalla podemos ver algo como esto:
Citar
      MENU EVENTOS
      ---- -------

[1] - Crear nuevo EVENTO
[2] - Crear nueva ACTIVIDAD
[3] - Mostrar ACTIVIDAD con mayor número de participantes
[4] - Mostrar ACTIVIDAD con menor número de participantes
[5] - Mostrar total participantes de un EVENTO
[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes
[7] - Consultar ACTIVIDADES de un expositor
[8] - Mostrar programación de un EVENTO

[ 0] - SALIR del programa

Escoja opción: 8

EVENTOS disponibles:
0 - Tecnotic
1 - Softhard

Seleccione nº de EVENTO: 0

Aún no se han programado ACTIVIDADES para este EVENTO

Pulse ENTER para seguir...
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #9 en: 29 de Noviembre 2020, 02:01 »
Estoy re confundido, no entendí muy bien.

¿La clase principal es MenuEvento?

¿Me podrías mostrar cómo lo agrego a las clases? Es que no entendi muy bien. O mostrar cómo debería de quedar cada clase. es que lo inserto y me aparecen errores
« Última modificación: 01 de Abril 2021, 11:27 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #10 en: 29 de Noviembre 2020, 02:42 »
Sí.
Vamos a tener 3 clases: Actividad, Evento y MenuEventos.

Cada clase será un archivo .java separado.
Es decir, tu proyecto ha de tener tres archivos: Actividad.java, Evento.java y MenuEventos.java.

No se si estás usando algún IDE como NetBeans, Eclipse, etc... Pero la estructura del proyecto viene a ser igual en todos.

Estos tres archivos deberían estar dentro de lo que se llama un package, es decir dentro de un directorio.
Puedes llamarlo como quieras, yo lo he llamado actividadesYeventos

Este package estaría dentro de la carpeta src de tu proyecto.

Te muestro foto de la estructura de mi proyecto Java, que en mi caso se llama "Varios" porque tengo varios packages con distintos programas.



MenuEventos es la clase principal, la que tiene el método main() que pone en marcha el programa y además tendrá los métodos para hacer funcionar cada opción del menú, que iremos añadiendo poco a poco.

Según añadimos nuevas funcionalidades al programa, vamos a tener que ir modificando las tres clases para añadirles nuevos métodos que hagan posible esas funcionalidades.
El código de estas clases que puse al principio solo tenía lo básico, según avanzamos en el programa su código irá aumentando.

Ahora mismo, las clases deberían estar así.

Actividad

Código: [Seleccionar]
package actividadesYeventos;

public class Actividad {

private String nombre;
private String expositor;//Persona que expone
private String hora;
private int participantes;

/*
* Constructor sin parámetros.
* Con esto nos aseguramos de que al construir
* un objeto Actividad, no tendremos atributos
* con valor null
*/
public Actividad() {
nombre = "";
expositor = "";
hora = "";
participantes = 0;
}

/*
* Constructor con parámetros.
* El objeto se construye recibiendo los valores
* que vamos a asignar a los atributos.
*/
public Actividad(String nombreActiv, String nombreExpos, String horaActiv, int numParticipan) {
nombre = nombreActiv;
expositor = nombreExpos;
hora = horaActiv;
participantes = numParticipan;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreActiv) {
nombre = nombreActiv;
}

public String getExpositor() {
return expositor;
}

public void setExpositor(String nombreExpos) {
expositor = nombreExpos;
}

public String getHora() {
return hora;
}

public void setHora(String horaActiv) {
hora = horaActiv;
}

public int getParticipantes() {
return participantes;
}

public void setParticipantes(int numParticipan) {
participantes = numParticipan;
}

@Override
public String toString() {
return "\n\t\t----------------\nNombre de ACTIVIDAD: " + nombre
+ "\nExpositor: " + expositor
+ "\nHora: " +  hora + "\nParticipantes: " + participantes
+ "\n\t\t----------------\n";
}
}

Evento
Código: [Seleccionar]
package actividadesYeventos;

public class Evento {

private String nombre;
private String fecha;
private String organizador;
private String facultad;
private String tema;

//Salones de Actividades
private Actividad[] salones;

public Evento() {
nombre = "";
fecha = "";
organizador = "";
facultad = "";
tema = "";
salones = new Actividad[0]; //Contructor por defecto implica tener 0 salones.
}

public Evento(String nombreEven, String fechaEven, String organizaEven,
String facultadEven, String temaEven, int numSalones) {
nombre = nombreEven;
fecha = fechaEven;
organizador = organizaEven;
facultad = facultadEven;
tema = temaEven;
salones = new Actividad[numSalones]; //Al construir un evento, nos dirán cuantos salones tendrá
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreEven) {
nombre = nombreEven;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fechaEven) {
fecha = fechaEven;
}

public String getOrganizador() {
return organizador;
}

public void setOrganizador(String organizaEven) {
organizador = organizaEven;
}

public String getFacultad() {
return facultad;
}

public void setFacultad(String facultadEven) {
facultad = facultadEven;
}

public String getTema() {
return tema;
}

public void setTema(String temaEven) {
tema = temaEven;
}

public void setNumSalones(int numSalones) {
salones = new Actividad[numSalones];
}

public void mostrarProgramacion() {

//Es posible que no hayan salones asignados.
if (salones.length == 0)
System.out.println("\nEste EVENTO no tiene salones de ACTIVIDADES asignados");
else {
/*
* Sí hay salones asignados, pero puede que aun no hayan actividades.
* Si TODAS las posiciones del array de Actividad tienen valor null,
* es que no hay actividades programadas.
*/
boolean hayActividades = false;//Si encontramos al menos 1 actividad, pasará a true
for (int i = 0; i < salones.length; i++) {
if (salones[i] != null) {
hayActividades = true; //Sí que hay actividades programadas
System.out.println("\nNº de Salón: " + i);
System.out.println(salones[i]);//Mostramos datos de la Actividad
}
}
/*
* Terminado el bucle FOR, si la variable hayActividades
* conserva valor FALSE, es que no hay actividades
* programadas en este Evento y lo indicamos en pantalla.
*/
if (!hayActividades)
System.out.println("\nAún no se han programado ACTIVIDADES para este EVENTO");
}
}

}

MenuEventos

Código: [Seleccionar]
package actividadesYeventos;

import java.util.ArrayList;
import java.util.Scanner;

public class MenuEventos {

//Aquí se almacenarán los Eventos
private static ArrayList<Evento> eventos = new ArrayList<Evento>();
//Objeto Scanner para leer datos por teclado
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

crearEventosPorDefecto(); //Invocamos método que nos proporciona dos eventos.

String opcion = "";//Variable para recoger opcion del usuario

do {
System.out.println("\n\t\tMENU EVENTOS");
System.out.println("\t\t---- -------\n");
System.out.println("[1] - Crear nuevo EVENTO");
System.out.println("[2] - Crear nueva ACTIVIDAD");
System.out.println("[3] - Mostrar ACTIVIDAD con mayor número de participantes");
System.out.println("[4] - Mostrar ACTIVIDAD con menor número de participantes");
System.out.println("[5] - Mostrar total participantes de un EVENTO");
System.out.println("[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes");
System.out.println("[7] - Consultar ACTIVIDADES de un expositor");
System.out.println("[8] - Mostrar programación de un EVENTO");
System.out.println("\n[0] - SALIR del programa");
System.out.print("\nEscoja opción: ");
opcion = teclado.nextLine();
//Evaluamos opcion escogida
switch(opcion) {
case "0":
System.out.println("\n\t\t--FIN DE PROGRAMA--");
break;
case "1":
System.out.println("\nEn construccion...");
break;
case "2":
System.out.println("\nEn construccion...");
break;
case "3":
System.out.println("\nEn construccion...");
break;
case "4":
System.out.println("\nEn construccion...");
break;
case "5":
System.out.println("\nEn construccion...");
break;
case "6":
System.out.println("\nEn construccion...");
break;
case "7":
System.out.println("\nEn construccion...");
break;
case "8":
mostrarActividadesEvento();
break;
default:
System.out.println("\nOpción no válida...");
}
pausa();
} while(!opcion.equals("0"));
}

/*
* Sencillo método que pausa la ejecución del programa
* hasta que el usuario pulse ENTER/INTRO
*/
private static void pausa() {
System.out.println("\nPulse ENTER para seguir...\n");
teclado.nextLine();
}

/*
* Crearemos dos eventos via código para que el
* programa comience con algunos datos con los
* que trabajar
*/
private static void crearEventosPorDefecto() {

/*
* Recordamos que un evento tiene los atributos:
* nombre, fecha, organizador, facultad que organiza,
* temática y salones disponibles para actividades
*/
Evento tecnotic = new Evento("Tecnotic", "03/02/2021", "Ismael Clemente",
"MIT Club of Spain", "IA aplicada en operaciones bursátiles", 5);
Evento softhard = new Evento("Softhard", "14/03/2021", "ParqueSoft",
"Universidad Antonio Jose Camacho", "Software Libre en Seguridad Informática", 3);
//Eventos creados, los agregamos al ArrayList que los almacena
eventos.add(tecnotic);
eventos.add(softhard);
}

/*
* Muestra al usuario los Eventos disponibles para que
* elija uno y saldrá en pantalla sus Actividades programadas,
* si es que las tiene.
*/
private static void mostrarActividadesEvento() {
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

/*
* Con try catch, podemos capturar la posible
* excepción que podría ocurrir si el usuario
* nos da una posición que no existe en el ArrayList
* y así obraremos en consecuencia.
*/
try {
eventos.get(num).mostrarProgramacion();
} catch(IndexOutOfBoundsException ex) {
System.out.println("Selección equivocada...");
}
}
}
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #11 en: 29 de Noviembre 2020, 03:10 »
Listo, ya voy entendiedo el orden. ¿Y para almacenar los datos de cada opción del menu como se haría?
« Última modificación: 01 de Abril 2021, 11:28 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #12 en: 29 de Noviembre 2020, 03:14 »
Podemos continuar añadiendo dos nuevas funcionalidades:
Añadir Eventos y Añadir Actividades (a un Evento)

Añadir Evento, la opción 1 del menú, es sencillo.
Solo hay que pedir por teclado los datos necesarios para construir un Evento.
Una vez los tenemos, añadimos al ArrayList el nuevo Evento.

A la clase MenuEventos, le añadimos este método:
Código: [Seleccionar]
/*
* Pide los datos necesarios para crear
* un Evento y lo agrega al ArrayList
*/
private static void crearEvento() {
//Pedimos datos del evento
System.out.println("\nNombre del EVENTO: ");
String nombre = teclado.nextLine();
System.out.println("Fecha: ");
String fecha = teclado.nextLine();
System.out.println("Organizador: ");
String organizador = teclado.nextLine();
System.out.println("Facultad que organiza: ");
String facultad = teclado.nextLine();
System.out.println("Temática: ");
String tema = teclado.nextLine();
System.out.println("Cantidad salones asignados: ");
int salones = Integer.parseInt(teclado.nextLine());
//Creamos un evento nuevo y añadimos al ArrayList
eventos.add(new Evento(nombre, fecha, organizador, facultad, tema, salones));
}

Y en el case 1 del SWITCH, invocamos este método:
Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            crearEvento();
            break;
         case "2":

Ahora ya podemos crear más Eventos, a parte de los otros dos que el enunciado nos pedía hardcodear

Pero pasemos a algo más interesante, programar Actividades para un Evento.

Esta vez el proceso es un poco, solo un poco, más difícil.

Primero pediremos los datos necesarios para crear una Actividad.
Cuando la tengamos, le mostraremos al usuario los Eventos disponibles para que elija uno.
Cuando lo haya elegido, mostraremos en pantalla los "salones" que ese Evento tiene disponibles para que el usuario elija un salón

Así, ya podemos pedirle al Evento, que programe esa Actividad, en ese salón.

Para facilitar todo esto, vamos a modificar la clase Evento para añadirle dos nuevas funcionalidades.
Una va a ser que nos comunique que salones tiene disponibles. Podemos hacer por ejemplo que construya un String con los números de salones (posiciones del arreglo de Actividades) que tengan valor null, es decir, que todavía no tienen Actividades.
Si todos los salones están ocupados, retornará un String vacío.

A Evento, le añadimos este método:
Código: [Seleccionar]
/*
* Construye un String con los indices del arreglo
* que están libres y pueden recibir una Actividad.
* Si no hay ninguno libre, el String retornado estará vacío.
*/
public String getSalonesDisponibles() {

String disponibles = "";
/*
* Recorremos los "salones", aquellos con valor null
* significa que están libres, así que recogemos su número
* para mostrárselo al usuario
*/
for (int i = 0; i < salones.length; i++)
if (salones[i] == null) //Salón está libre
disponibles += "[" + i + "] ";

return disponibles;
}

La siguiente funcionalidad que necesitamos para Evento, es que reciba una Actividad y un número de salón, y agregue esa Actividad al arreglo.
Deberá gestionar las posibilidades de que el "salón" ya esté ocupado y también que nos hayan dado un número de salón que no existe.

Le añadimos este otro método:
Código: [Seleccionar]
/*
* Recibe una Actividad y un número de salón donde programarla.
* Si en esta posición del arreglo (el salón) ya existe una Actividad
* o no existe dicha posición, se informará en pantalla.
*/
public void programarActividad(Actividad act, int salon) {

try {
if (salones[salon] == null) { //Salón disponible
salones[salon] = act;
System.out.println("\nLa ACTIVIDAD ha sido programada.");
}
else //Salon no tiene valor null, ya está ocupado por otro actividad
System.out.println("\nEl salón seleccionado ya tiene una ACTIVIDAD programada.");
} catch(IndexOutOfBoundsException ex) { //Nos han dado un número de salón que no existe
System.out.println("\nNo existe el salón: " + salon);
}
}

Ahora Evento ya es capaz de informar de salones disponibles y también de añadir una Actividad en el salón indicado.
Volvemos a la clase MenuEventos para añadir un método que nos permita crear una Actividad y programarla en el Evento y salón escogidos por el usuario.

Código: [Seleccionar]
/*
* Permite al usuario crear una Actividad y escoger
* un Evento y salón disponible para programarla.
*/
private static void crearActividad() {
//Pedimos datos de la actividad
System.out.println("Nombre de la ACTIVIDAD: ");
String nombre = teclado.nextLine();
System.out.println("Expositor: ");
String expositor = teclado.nextLine();
System.out.println("Hora: ");
String hora = teclado.nextLine();
System.out.println("Cantidad de Participantes: ");
int participantes = Integer.parseInt(teclado.nextLine());

//Creamos la Actividad
Actividad nuevaActiv = new Actividad(nombre, expositor, hora, participantes);

//Tenemos Actividad, preguntamos en que Evento lo vamos a programar
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

try {
Evento evento = eventos.get(num);
String salones = evento.getSalonesDisponibles();
if (salones.isEmpty())//Evento ha retornado un String vacío, no hay salones libres
System.out.println("Este EVENTO está completo. No hay salones disponibles.");
else {
System.out.println("Salones disponibles: " + salones);
System.out.print("Elija salón donde programar la ACTIVIDAD: ");
int salon = Integer.parseInt(teclado.nextLine());
evento.programarActividad(nuevaActiv, salon);//Pasamos actividad y salon, Evento se encarga del resto
}
} catch(IndexOutOfBoundsException ex) {//Ha elegido un evento que no existe
System.out.println("Selección equivocada...");
}
}

Y por último, en el case 2 del SWITCH, llamamos a este método:
Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            crearEvento();
            break;
         case "2":
            crearActividad();
            break;

Ahora ya podemos crear Eventos y Actividades.
Y ver las Actividades programadas.

En pantalla vemos algo así:

Citar
      MENU EVENTOS
      ---- -------

[1] - Crear nuevo EVENTO
[2] - Crear nueva ACTIVIDAD
[3] - Mostrar ACTIVIDAD con mayor número de participantes
[4] - Mostrar ACTIVIDAD con menor número de participantes
[5] - Mostrar total participantes de un EVENTO
[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes
[7] - Consultar ACTIVIDADES de un expositor
[8] - Mostrar programación de un EVENTO

[ 0] - SALIR del programa

Escoja opción: 1

Nombre del EVENTO:
Java
Fecha:
29/11/2020
Organizador:
Aprender A Programar
Facultad que organiza:
APR
Temática:
Código Java
Cantidad salones asignados:
5

Pulse ENTER para seguir...



      MENU EVENTOS
      ---- -------

[1] - Crear nuevo EVENTO
[2] - Crear nueva ACTIVIDAD
[3] - Mostrar ACTIVIDAD con mayor número de participantes
[4] - Mostrar ACTIVIDAD con menor número de participantes
[5] - Mostrar total participantes de un EVENTO
[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes
[7] - Consultar ACTIVIDADES de un expositor
[8] - Mostrar programación de un EVENTO

[ 0] - SALIR del programa

Escoja opción: 2
Nombre de la ACTIVIDAD:
Programación Orientada a Objetos
Expositor:
Kabuto
Hora:
03:00
Cantidad de Participantes:
26

EVENTOS disponibles:
0 - Tecnotic
1 - Softhard
2 - Java

Seleccione nº de EVENTO: 2
Salones disponibles: [ 0] [1] [2] [3] [4]
Elija salón donde programar la ACTIVIDAD: 2

La ACTIVIDAD ha sido programada.

Pulse ENTER para seguir...



      MENU EVENTOS
      ---- -------

[1] - Crear nuevo EVENTO
[2] - Crear nueva ACTIVIDAD
[3] - Mostrar ACTIVIDAD con mayor número de participantes
[4] - Mostrar ACTIVIDAD con menor número de participantes
[5] - Mostrar total participantes de un EVENTO
[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes
[7] - Consultar ACTIVIDADES de un expositor
[8] - Mostrar programación de un EVENTO

[ 0] - SALIR del programa

Escoja opción: 8

EVENTOS disponibles:
0 - Tecnotic
1 - Softhard
2 - Java

Seleccione nº de EVENTO: 2

Nº de Salón: 2

      ----------------
Nombre de ACTIVIDAD: Programación Orientada a Objetos
Expositor: Kabuto
Hora: 03:00
Participantes: 26
      ----------------


Pulse ENTER para seguir...
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #13 en: 29 de Noviembre 2020, 04:19 »
Hola, desde crearActividad me aparece un error al declarar las variables, no sé por qué. ¿Me puedes mostrar como queda el codigo completo de la clase Evento?
« Última modificación: 01 de Abril 2021, 11:29 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #14 en: 29 de Noviembre 2020, 12:02 »
Adjunto en este mensaje el código de los tres archivos .java tal y como los tengo ahora.
(Debajo de este texto).

Hoy domingo trabajo  :-\ , luego más tarde a ver si puedo seguir avanzando con el programa.

Mientras tanto, revisa bien el código por si te surgen nuevas dudas.


Código de la clase Actividad

Código: [Seleccionar]
package actividadesYeventos;

public class Actividad {

private String nombre;
private String expositor;//Persona que expone
private String hora;
private int participantes;

/*
* Constructor sin parámetros.
* Con esto nos aseguramos de que al construir
* un objeto Actividad, no tendremos atributos
* con valor null
*/
public Actividad() {
nombre = "";
expositor = "";
hora = "";
participantes = 0;
}

/*
* Constructor con parámetros.
* El objeto se construye recibiendo los valores
* que vamos a asignar a los atributos.
*/
public Actividad(String nombreActiv, String nombreExpos, String horaActiv, int numParticipan) {
nombre = nombreActiv;
expositor = nombreExpos;
hora = horaActiv;
participantes = numParticipan;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreActiv) {
nombre = nombreActiv;
}

public String getExpositor() {
return expositor;
}

public void setExpositor(String nombreExpos) {
expositor = nombreExpos;
}

public String getHora() {
return hora;
}

public void setHora(String horaActiv) {
hora = horaActiv;
}

public int getParticipantes() {
return participantes;
}

public void setParticipantes(int numParticipan) {
participantes = numParticipan;
}

@Override
public String toString() {
return "\n\t\t----------------\nNombre de ACTIVIDAD: " + nombre
+ "\nExpositor: " + expositor
+ "\nHora: " +  hora + "\nParticipantes: " + participantes
+ "\n\t\t----------------\n";
}
}


Código de la clase Evento

Código: [Seleccionar]
package actividadesYeventos;

public class Evento {

private String nombre;
private String fecha;
private String organizador;
private String facultad;
private String tema;

//Salones de Actividades
private Actividad[] salones;

public Evento() {
nombre = "";
fecha = "";
organizador = "";
facultad = "";
tema = "";
salones = new Actividad[0]; //Contructor por defecto implica tener 0 salones.
}

public Evento(String nombreEven, String fechaEven, String organizaEven,
String facultadEven, String temaEven, int numSalones) {
nombre = nombreEven;
fecha = fechaEven;
organizador = organizaEven;
facultad = facultadEven;
tema = temaEven;
salones = new Actividad[numSalones]; //Al construir un evento, nos dirán cuantos salones tendrá
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombreEven) {
nombre = nombreEven;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fechaEven) {
fecha = fechaEven;
}

public String getOrganizador() {
return organizador;
}

public void setOrganizador(String organizaEven) {
organizador = organizaEven;
}

public String getFacultad() {
return facultad;
}

public void setFacultad(String facultadEven) {
facultad = facultadEven;
}

public String getTema() {
return tema;
}

public void setTema(String temaEven) {
tema = temaEven;
}

public void setNumSalones(int numSalones) {
salones = new Actividad[numSalones];
}

public void mostrarProgramacion() {

//Es posible que no hayan salones asignados.
if (salones.length == 0)
System.out.println("\nEste EVENTO no tiene salones de ACTIVIDADES asignados");
else {
/*
* Sí hay salones asignados, pero puede que aun no hayan actividades.
* Si TODAS las posiciones del array de Actividad tienen valor null,
* es que no hay actividades programadas.
*/
boolean hayActividades = false;//Si encontramos al menos 1 actividad, pasará a true
for (int i = 0; i < salones.length; i++) {
if (salones[i] != null) {
hayActividades = true; //Sí que hay actividades programadas
System.out.println("\nNº de Salón: " + i);
System.out.println(salones[i]);//Mostramos datos de la Actividad
}
}
/*
* Terminado el bucle FOR, si la variable hayActividades
* conserva valor FALSE, es que no hay actividades
* programadas en este Evento y lo indicamos en pantalla.
*/
if (!hayActividades)
System.out.println("\nAún no se han programado ACTIVIDADES para este EVENTO");
}
}

/*
* Construye un String con los indices del arreglo
* que están libres y pueden recibir una Actividad.
* Si no hay ninguno libre, el String retornado estará vacío.
*/
public String getSalonesDisponibles() {

String disponibles = "";
/*
* Recorremos los "salones", aquellos con valor null
* significa que están libres, así que recogemos su número
* para mostrarselo al usuario
*/
for (int i = 0; i < salones.length; i++)
if (salones[i] == null)
disponibles += "[" + i + "] ";

return disponibles;
}

/*
* Recibe una Actividad y un número de salón donde programarla.
* Si en esta posición del arreglo (el salón) ya existe una Actividad
* o no existe dicha posición, se informará en pantalla.
*/
public void programarActividad(Actividad act, int salon) {

try {
if (salones[salon] == null) { //Salón disponible
salones[salon] = act;
System.out.println("\nLa ACTIVIDAD ha sido programada.");
}
else //Salon no tiene valor null, ya está ocupado por otro actividad
System.out.println("\nEl salón seleccionado ya tiene una ACTIVIDAD programada.");
} catch(IndexOutOfBoundsException ex) { //Nos han dado un número de salón que no existe
System.out.println("\nNo existe el salón: " + salon);
}
}

}


Código de la clase MenuEventos

Código: [Seleccionar]
package actividadesYeventos;

import java.util.ArrayList;
import java.util.Scanner;

public class MenuEventos {

//Aquí se almacenarán los Eventos
private static ArrayList<Evento> eventos = new ArrayList<Evento>();
//Objeto Scanner para leer datos por teclado
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

crearEventosPorDefecto(); //Invocamos método que nos proporciona dos eventos.

String opcion = "";//Variable para recoger opcion del usuario

do {
System.out.println("\n\t\tMENU EVENTOS");
System.out.println("\t\t---- -------\n");
System.out.println("[1] - Crear nuevo EVENTO");
System.out.println("[2] - Crear nueva ACTIVIDAD");
System.out.println("[3] - Mostrar ACTIVIDAD con mayor número de participantes");
System.out.println("[4] - Mostrar ACTIVIDAD con menor número de participantes");
System.out.println("[5] - Mostrar total participantes de un EVENTO");
System.out.println("[6] - Mostrar ACTIVIDADES ordenadas de mayor a menos número de participantes");
System.out.println("[7] - Consultar ACTIVIDADES de un expositor");
System.out.println("[8] - Mostrar programación de un EVENTO");
System.out.println("\n[0] - SALIR del programa");
System.out.print("\nEscoja opción: ");
opcion = teclado.nextLine();
//Evaluamos opcion escogida
switch(opcion) {
case "0":
System.out.println("\n\t\t--FIN DE PROGRAMA--");
break;
case "1":
crearEvento();
break;
case "2":
crearActividad();
break;
case "3":
System.out.println("\nEn construccion...");
break;
case "4":
System.out.println("\nEn construccion...");
break;
case "5":
System.out.println("\nEn construccion...");
break;
case "6":
System.out.println("\nEn construccion...");
break;
case "7":
System.out.println("\nEn construccion...");
break;
case "8":
mostrarActividadesEvento();
break;
default:
System.out.println("\nOpción no válida...");
}
pausa();
} while(!opcion.equals("0"));
}

/*
* Sencillo método que pausa la ejecución del programa
* hasta que el usuario pulse ENTER/INTRO
*/
private static void pausa() {
System.out.println("\nPulse ENTER para seguir...\n");
teclado.nextLine();
}

/*
* Crearemos dos eventos via código para que el
* programa comience con algunos datos con los
* que trabajar
*/
private static void crearEventosPorDefecto() {

/*
* Recordamos que un evento tiene los atributos:
* nombre, fecha, organizador, facultad que organiza,
* temática y salones disponibles para actividades
*/
Evento tecnotic = new Evento("Tecnotic", "03/02/2021", "Ismael Clemente",
"MIT Club of Spain", "IA aplicada en operaciones bursátiles", 5);
Evento softhard = new Evento("Softhard", "14/03/2021", "ParqueSoft",
"Universidad Antonio Jose Camacho", "Software Libre en Seguridad Informática", 3);
//Eventos creados, los agregamos al ArrayList que los almacena
eventos.add(tecnotic);
eventos.add(softhard);
}

/*
* Muestra al usuario los Eventos disponibles para que
* elija uno y saldrá en pantalla sus Actividades programadas,
* si es que las tiene.
*/
private static void mostrarActividadesEvento() {
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

/*
* Con try catch, podemos capturar la posible
* excepción que podría ocurrir si el usuario
* nos da una posición que no existe en el ArrayList
* y así obraremos en consecuencia.
*/
try {
eventos.get(num).mostrarProgramacion();
} catch(IndexOutOfBoundsException ex) {
System.out.println("Selección equivocada...");
}
}

/*
* Pide los datos necesarios para crear
* un Evento y lo agrega al ArrayList
*/
private static void crearEvento() {
//Pedimos datos del evento
System.out.println("\nNombre del EVENTO: ");
String nombre = teclado.nextLine();
System.out.println("Fecha: ");
String fecha = teclado.nextLine();
System.out.println("Organizador: ");
String organizador = teclado.nextLine();
System.out.println("Facultad que organiza: ");
String facultad = teclado.nextLine();
System.out.println("Temática: ");
String tema = teclado.nextLine();
System.out.println("Cantidad salones asignados: ");
int salones = Integer.parseInt(teclado.nextLine());
//Creamos un evento nuevo y añadimos al ArrayList
eventos.add(new Evento(nombre, fecha, organizador, facultad, tema, salones));
}

/*
* Permite al usuario crear una Actividad y escoger
* un Evento y salón disponible para programarla.
*/
private static void crearActividad() {
//Pedimos datos de la actividad
System.out.println("Nombre de la ACTIVIDAD: ");
String nombre = teclado.nextLine();
System.out.println("Expositor: ");
String expositor = teclado.nextLine();
System.out.println("Hora: ");
String hora = teclado.nextLine();
System.out.println("Cantidad de Participantes: ");
int participantes = Integer.parseInt(teclado.nextLine());

//Creamos la Actividad
Actividad nuevaActiv = new Actividad(nombre, expositor, hora, participantes);

//Tenemos Actividad, preguntamos en que Evento lo vamos a programar
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

try {
Evento evento = eventos.get(num);
String salones = evento.getSalonesDisponibles();
if (salones.isEmpty())//Evento ha retornado un String vacío, no hay salones libres
System.out.println("Este EVENTO está completo. No hay salones disponibles.");
else {
System.out.println("Salones disponibles: " + salones);
System.out.print("Elija salón donde programar la ACTIVIDAD: ");
int salon = Integer.parseInt(teclado.nextLine());
evento.programarActividad(nuevaActiv, salon);//Pasamos actividad y salon, Evento se encarga del resto
}
} catch(IndexOutOfBoundsException ex) {//Ha elegido un evento que no existe
System.out.println("Selección equivocada...");
}
}
}
« Última modificación: 01 de Abril 2021, 11:33 por Ogramar »
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #15 en: 29 de Noviembre 2020, 13:29 »
buenos dias amigo sii claro, no ahi problema cuando usted pueda seguir ayudandome esta super, muchas gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #16 en: 30 de Noviembre 2020, 01:44 »
Vamos a añadir dos nuevas funcionalidades que son muy parecidas, las de mostrar la Actividad con mayor número de participantes y la de menor.

Pero primero, para que sea más cómodo probar estas funciones, creo que conviene añadir por código algunas Actividades a los dos Eventos que nos pedían crear en el enunciado.
Si no, cada vez que ejecutamos el programa y queramos probar las nuevas funciones, tendríamos que teclear nuevas Actividades siempre.
Si creamos ya algunas por código, ya comenzaremos el programa con datos listos para trabajar.

Así que podemos modificar el método donde creábamos los dos Eventos, y les añadimos dos Actividades a cada uno:

Citar
   private static void crearEventosPorDefecto() {
      
      /*
       * Recordamos que un evento tiene los atributos:
       * nombre, fecha, organizador, facultad que organiza,
       * temática y salones disponibles para actividades
       */
      Evento tecnotic = new Evento("Tecnotic", "03/02/2021", "Ismael Clemente",
            "MIT Club of Spain", "IA aplicada en operaciones bursátiles", 5);
      Evento softhard = new Evento("Softhard", "14/03/2021", "ParqueSoft",
            "Universidad Antonio Jose Camacho", "Software Libre en Seguridad Informática", 3);
      //Además, les vamos a proporcionar algunas Actividades
      tecnotic.programarActividad(new Actividad("Computación neuronal", "Kenzo Hirai", "09:30", 45), 0);
      tecnotic.programarActividad(new Actividad("CPU cuántica", "Santiago Gutierrez", "12:00", 32), 3);
      softhard.programarActividad(new Actividad("Kernel UNIX", "Michael John", "13:15", 25), 1);
      softhard.programarActividad(new Actividad("Heurística por hardware", "Teresa Almeida", "12:00", 32), 2);

      //Eventos creados, los agregamos al ArrayList que los almacena
      eventos.add(tecnotic);
      eventos.add(softhard);
   }


Bien, para obtener la Actividad con mayor número de participantes, tenemos que recorrer los Eventos, y por cada Evento, recorrer sus Actividades buscando la Actividad con el mayor número de participantes.

Para facilitar esto, podemos programarle a la clase Evento un método que se encargue de recorrer por su cuenta sus Actividades y retorne la Actividad con más participantes.

A Evento, le añadimos este método:
Código: [Seleccionar]
/*
* Busca la Actividad programada con más participantes y la retorna.
* Si no hubieran Actividades en este Evento, se retornará valor null.
*/
public Actividad getActividadMasParticipantes() {

/*
* Buscaremos Actividades en los "salones" y guardaremos su cantidad de participantes
* para poder comparar con las siguientes y determinar cuál tiene
* MAYOR número de participantes.
*
* Para ello, iniciamos una variable con el valor int más BAJO posible
* y tener un valor inicial con el que poder comparar, buscando valores MAYORES
*/
int maxParticipantes = Integer.MIN_VALUE; //Para este caso, en realidad habría bastado con iniciar a 0

//Aquí guardaremos la actividad de MAYOR participacion
Actividad mayor = null;

for (Actividad activ: salones) {
if (activ != null) //Solo consultamos salones que tengan Actividad programada
if (activ.getParticipantes() > maxParticipantes) {
//Esta Actividad tiene MAS participantes que la anterior consultada
maxParticipantes = activ.getParticipantes(); //Actualizamos cantidad mayor de participantes
mayor = activ; //Guardamos la Actividad que, por ahora, tiene record de participantes
}
}

return mayor; //Retornamos la Actividad con más participantes
}

Y también este otro, que es prácticamente lo mismo, pero para encontrar la Actividad con menor participación.

Código: [Seleccionar]
/*
* Busca la Actividad programada con menos participantes y la retorna.
* Si no hubieran Actividades en este Evento, se retornará valor null.
*/
public Actividad getActividadMenosParticipantes() {

/*
* Buscaremos Actividades en los "salones" y guardaremos su cantidad de participantes
* para poder comparar con las siguientes y determinar cuál tiene
* MENOR número de participantes.
*
* Para ello, iniciamos una variable con el valor int más ALTO posible
* y tener un valor inicial con el que poder comparar, buscando valores MENORES
*/
int minParticipantes = Integer.MAX_VALUE;

//Aquí guardaremos la actividad de MENOR participacion
Actividad menor = null;

for (Actividad activ: salones) {
if (activ != null) //Solo consultamos salones que tengan Actividad programada
if (activ.getParticipantes() < minParticipantes) {
//Esta Actividad tiene MENOS participantes que la anterior consultada
minParticipantes = activ.getParticipantes();
menor = activ;
}
}

return menor; //Retornamos la Actividad con más participantes
}


Con estos dos métodos, ya podemos pedirle a un Evento que nos retorne su Actividad con mayor o menor número de participantes.

Ahora volvemos a la clase principal MenuEventos para añadir los métodos que, de TODOS los Eventos, encuentre la mayor o menos Actividad de todas.

El código será muy similar a los que hemos escrito, pero ahora recorremos Eventos y además guardaremos el nombre del Evento que posee la Actividad mayor o menor.
Así podemos darle al usuario información más completa.

Así que añadimos estos dos métodos a MenuEventos:
Código: [Seleccionar]
private static void mostrarActividadMayor() {
/*
* Recorreremos los Eventos, pidiéndole a cada uno
* que nos devuelva su Actividad con más participantes
* y de todas estas nos quedaremos con la mayor de todas.
*/

Actividad mayor = null;
int maxParticipantes = Integer.MIN_VALUE;
String eventoMayor = ""; //También guardaremos el nombre del Evento con Actividad mayor.

for (Evento event: eventos) {
if (event.getActividadMasParticipantes() != null)
if (event.getActividadMasParticipantes().getParticipantes() > maxParticipantes) {
mayor = event.getActividadMasParticipantes();
maxParticipantes = mayor.getParticipantes();
eventoMayor = event.getNombre();
}
}

/*
* Comprobamos si tenemos alguna Actividad como resultado
* y mostramos datos.
* Podríamos no tener ningún resultado, debido a que quizás
* aún no se han programado Actividades.
*/

if (mayor ==  null)
System.out.println("No hay ACTIVIDADES programadas en ningún EVENTO");
else {
System.out.println("\nACTIVIDAD con más participantes");
System.out.println("- Nombre: " + mayor.getNombre());
System.out.println("- Participantes: " + maxParticipantes);
System.out.println("- Evento: " + eventoMayor);
}
}

private static void mostrarActividadMenor() {

Actividad menor = null;
int minParticipantes = Integer.MAX_VALUE;
String eventoMenor = "";

for (Evento event: eventos) {
if (event.getActividadMenosParticipantes() != null)
if (event.getActividadMenosParticipantes().getParticipantes() < minParticipantes) {
menor = event.getActividadMenosParticipantes();
minParticipantes = menor.getParticipantes();
eventoMenor = event.getNombre();
}
}

if (menor ==  null)
System.out.println("No hay ACTIVIDADES programadas en ningún EVENTO");
else {
System.out.println("\nACTIVIDAD con menos participantes");
System.out.println("- Nombre: " + menor.getNombre());
System.out.println("- Participantes: " + minParticipantes);
System.out.println("- Evento: " + eventoMenor);
}
}

Y en el SWITCH, llamamos a estos métodos en los cases correspondientes:
Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            crearEvento();
            break;
         case "2":
            crearActividad();
            break;
         case "3":
            mostrarActividadMayor();
            break;
         case "4":
            mostrarActividadMenor();
            break;

Y ya podemos buscar las Actividades con más y menos participantes, de todos los Eventos existentes.
« Última modificación: 01 de Abril 2021, 11:35 por Ogramar »
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: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #17 en: 30 de Noviembre 2020, 01:59 »
Aún tengo tiempo de añadir otra funcionalidad del menú.
La de mostrar el total de participantes de un Evento, que es algo muy sencillo.

Para esta opción lo que haremos será pedir al usuario que elija un Evento y le mostraremos cuantos participantes hay en total.
Es decir, sumaremos los participantes de todas las Actividades de ese Evento seleccionado.

De nuevo, lo mejor es "enseñarle" a la clase Evento que sea capaz de darnos este dato.
Así que le añadimos este método:
Código: [Seleccionar]
/*
* Retorna la suma total de participantes
* de todas las Actividades de este Evento.
*/
public int totalParticipantes() {

int sumaParticipantes = 0;

//Recorremos arreglo de Actividades, y sumamos sus participantes
for (Actividad activ: salones)
if (activ != null)
sumaParticipantes += activ.getParticipantes();

return sumaParticipantes;
}

Y en la clase principal MenuEventos, añadimos este método para que el usuario elija un Evento y podamos mostrarle este dato:

Código: [Seleccionar]
private static void mostrarTotalParticipantesEvento() {
System.out.println("\nEVENTOS disponibles:");
for (int i = 0; i < eventos.size(); i++) {
System.out.println(i + " - " + eventos.get(i).getNombre());
}
System.out.print("\nSeleccione nº de EVENTO: ");
int num = Integer.parseInt(teclado.nextLine());

try {
System.out.println("Evento seleccionado: " + eventos.get(num).getNombre());
System.out.println("Total participantes: " + eventos.get(num).totalParticipantes());
} catch(IndexOutOfBoundsException ex) {
System.out.println("Selección equivocada...");
}
}

Y en el SWITCH llamamos a este nuevo método, y listo..

Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            crearEvento();
            break;
         case "2":
            crearActividad();
            break;
         case "3":
            mostrarActividadMayor();
            break;
         case "4":
            mostrarActividadMenor();
            break;
         case "5":
            mostrarTotalParticipantesEvento();
            break;
« Última modificación: 01 de Abril 2021, 11:37 por Ogramar »
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

deank23

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #18 en: 30 de Noviembre 2020, 02:33 »
amigo de vendad muchas gracias!!

ya solo faltan las dos clases 6 y 7

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: java ayuda con este programa
« Respuesta #19 en: 30 de Noviembre 2020, 19:26 »
6ª opcion.
Ordenar de mayor a menor.

La cosa consistiría en recorrer todas las Actividades, de todos los Eventos, y ordenarlas según su atributo número de participantes.
Para ordenarlas, previamente habría que juntarlas todas en una misma colección.
Se podría usar un arreglo normal, pero como no sabemos cuántas Actividades vamos a encontrar, pues no sabemos a que tamaño deberíamos inicializarlo.

Para resolver este inconveniente tenemos dos opciones:
- Añadir más código extra para primero sumar las Actividades existentes y así saber que tamaño necesitamos para el arreglo. Esto además supone más ciclos de computación.

- Usar un ArrayList, que como ya explicamos, no tiene tamaño fijo y podemos ir metiéndole Actividades según las vamos encontrando, sin tener que contar primero cuántas hay.

Yo prefiero la segunda opción.
Así, crearemos un ArrayList con todas las Actividades, las ordenaremos, y las mostraremos en pantalla.

¿Y como ordenamos de mayor a menor?
Habrá que pedirle a cada actividad que nos indique sus participantes, comparar las participantes de una con las demás e intercambiar las posiciones entre ellas hasta conseguir que primero estén las de mayor participación y al final las de menos.

Ya puestos, podemos aprovechar y aprender algo nuevo usando la interfaz Comparable
Podemos pedirle a la clase Actividad que implemente esta interfaz, y esto nos añadirá un método que vamos a sobreescribir para que "enseñarle" como una Actividad ha de compararse con otra para decidir cuál es mayor y cuál menor.

Para ello, nos vamos a la clase Actividad y le pedimos que implemente esta interfaz:

Citar
package actividadesYeventos;

public class Actividad implements Comparable<Actividad>{
   
   private String nombre;
   private String expositor;//Persona que expone
   private String hora;
   private int participantes;

Con esa línea en negrita le estamos diciendo que implemente la interfaz Comparable, y que solo ha de aceptar objetos que pertenezcan a la clase Actividad para poder hacer la comparación.
No tiene sentido que acepte compararse con un String, o con un Integer, o con un Evento... ni con absolutamente nada que no sea una Actividad.

Al pedirle que implemente esa interfaz, el compilador/IDE nos va a EXIGIR que a esta clase le añadamos un método llamado compareTo().
Es dentro de este método donde vamos a poner el código para decidir cómo se han de comparar los objetos Actividad para decidir quien es mayor o menor.
Nosotros decidimos como hacerlo, podríamos decirle que se ordenara según el tamaño de su nombre, o por orden alfabético, o según la hora en la que la Actividad esta programada...

En este caso, nos interesa que se ordenen según la cantidad de participantes
Código: [Seleccionar]
/*
* Este método recibe "otra" Actividad por parámetro para compararse
* con "esta" Actividad.
* La comparación es para determinar una relación ordinal, es decir,
* quien es "menor" y quien es "mayor".
* La Actividad con MENOS participantes se considerará menor que otra
* con MÁS participantes.
*
* Si el objeto recibido tiene valor null, se producirá una excepción.
*/
@Override
public int compareTo(Actividad otraActividad) {

//Comparamos sus participantes, para ver quien es menor o mayor, o si son iguales
if (participantes == otraActividad.getParticipantes())
return 0; //Mismo número de participantes, son iguales
else if (participantes < otraActividad.getParticipantes())
return -1; //Esta Actividad es "menor" que la Actividad recibida por parámetro.
else
return 1; //Esta Actividad es "mayor".
}

Este método decide la comparación retornando un int.
Si el int es 0, es que los objetos son "iguales", es decir ninguno es mayor o menor.
Si retorna un valor negativo, es que ESTE objeto, es menor que el OTRO objeto que ha recibido por parámetros para compararse.

Si ESTE objeto es mayor, entonces retorna un valor positivo.

Java usa esta forma de compararse con la intención de que sea igual para todas las clases. Así luego podemos pedirle a las colecciones de datos que se ordenen ellas solas.

Es decir, el ArrayList de Actividades que vamos a construir después, si queremos ya podemos decirle con la instrucción sort() que el solito ordene sus elementos. Porque sus elementos ya tienen el método compareTo() y ya saben compararse ellos mismos para indicar quien es menor y quien es mayor.

Sin embargo, para este ejercicio cuyo propósito es aprender cosas nuevas, no vamos a ser tan cómodos de usar el sort() y usaremos un algoritmo de ordenación para hacer nosotros la tarea de ordenar.

Para esto, nos vamos a la clase MenuEventos para crear el método que mostrarás las Actividades ordenadas.
Este método, va a realizar estos pasos:

- Crear un ArrayList para objetos de la clase Actividad
- Recorrer cada Evento, y de cada Evento, recorrer sus "salones" buscando Actividades programadas que añadiremos a ese ArrayList.
- Ordenar el ArrayList de mayor a menor.
- Mostrar las Actividades en pantalla.

Aquí tenemos un problemita, para recorrer los "salones" de un Evento, necesitamos que el Evento nos de acceso directo a ellos. Y ahora mismo nuestra clase Evento no tiene ningún método que nos de ese acceso.
Así que primero, a la clase Evento vamos a darle este método para que nos retorne su arreglo de Actividades (sus "salones") y así tener libre acceso a ellos:
Código: [Seleccionar]
/*
* Retorna el array de Actividades al completo.
*/
public Actividad[] getSalones() {
return salones;
}

Con esto solucionamos el problemita para cumplir el segundo paso.
Ya sí podemos añadir este método a la clase MenuEventos

Código: [Seleccionar]
private static void mostrarActividadesMayorMenor() {

//Recopilaremos TODAS las Actividades programas en un único ArrayList
ArrayList<Actividad> actividades = new ArrayList<Actividad>();

/*
* Recorremos todos los Eventos y les pediremos sus Salones.
* De estos Salones, cogeremos las Actividades programadas
*/

for (Evento event: eventos) {
Actividad[] salones = event.getSalones();
for (Actividad activ: salones)
if (activ != null) //Buscamos Salones que si tengan Actividades
actividades.add(activ);
}

/*
* Ya hemos recorrido todos los Eventos y tenemos sus Actividades.
* Ahora hay que ordenar de mayor a menor.
* Pero ojo, puede que no hayamos encontrado Actividades,
* o que solo haya una y por tanto no hay nada que ordenar
*/

if (actividades.isEmpty())
System.out.println("No hay Actividades programadas en ningún Evento");
else if (actividades.size() == 1) {
System.out.println("\nActividades disponibles: 1");
System.out.println(actividades.get(0));
}
else {
System.out.println("\nActividades disponibles: " + actividades.size());
//Método Burbuja
for (int i = 0; i < actividades.size() - 1; i++) {
            for (int j = 0; j < actividades.size() - i - 1; j++) {
            //Si la actividad siguiente en el array, es MAYOR que la actual...
                if (actividades.get(j + 1).compareTo(actividades.get(j)) == 1) {
                //...entonces hay que intercambiar sus posiciones para ordenarlas
                    Actividad aux = actividades.get(j + 1);
                    actividades.set(j + 1, actividades.get(j));
                    actividades.set(j, aux);
                }
            }
        }
//ArrayList ordenado de mayor a menor. Mostramos las Actividades en pantalla
for (Actividad activ: actividades)
System.out.println(activ);
}

}

Para ordenar estamos usando el algoritmo de la Burbuja, un sistema muy usado en programación, de los primeros que se enseñan. No es el más óptimo pero si sencillo de usar y entender. Aunque puede que al principio tengas que ver más ejemplos para entender como funciona.

Y con esto, ya solo queda llamar a este método dentro del SWITCH

Citar
         switch(opcion) {
         case "0":
            System.out.println("\n\t\t--FIN DE PROGRAMA--");
            break;
         case "1":
            crearEvento();
            break;
         case "2":
            crearActividad();
            break;
         case "3":
            mostrarActividadMayor();
            break;
         case "4":
            mostrarActividadMenor();
            break;
         case "5":
            mostrarTotalParticipantesEvento();
            break;
         case "6":
            mostrarActividadesMayorMenor();
            break;
         case "7":
            System.out.println("\nEn construccion...");
            break;

Y ya podemos ver todas las Actividades ordenadas de mayor a menor.

Fíjate que si quisiéramos cambiar el orden y mostrarlas de menor a mayor, nos bastaría con pedirle al algoritmo de la burbuja que haga el cambio cuando compareTo() devuelva -1

Citar
         //Método Burbuja
         for (int i = 0; i < actividades.size() - 1; i++) {
               for (int j = 0; j < actividades.size() - i - 1; j++) {
                  //Si la actividad siguiente en el array, es MENOR que la actual...
                   if (actividades.get(j + 1).compareTo(actividades.get(j)) == -1) {
                      //...entonces hay que intercambiar sus posiciones para ordenarlas
                       Actividad aux = actividades.get(j + 1);
                       actividades.set(j + 1, actividades.get(j));
                       actividades.set(j, aux);
                   }
               }
           }
« Última modificación: 01 de Abril 2021, 11:41 por Ogramar »
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".