Gestión de Socios en Java: Colecciones, Iteradores y Quiz de Elementos Químicos
Ejercicio 1: Gestión de Socios de un Club Deportivo
A continuación se presenta la clase ClubApp, que implementa un sistema de gestión de socios utilizando una colección ArrayList.
public class ClubApp {
private ArrayList<Socio> socios;
public ClubApp() {
socios = new ArrayList<>();
}
public void añadir(Socio socio) {
for (Socio existingSocio : socios) {
if (existingSocio.getNumSocio() == socio.getNumSocio()) {
System.out.println("Error: Ya existe un socio con el número " + socio.getNumSocio());
return;
}
}
socios.add(socio);
System.out.println("Socio añadido exitosamente.");
}
public void eliminar(int numSocio) {
Socio socioAEliminar = null;
for (Socio socio : socios) {
if (socio.getNumSocio() == numSocio) {
socioAEliminar = socio;
break;
}
}
if (socioAEliminar != null) {
socios.remove(socioAEliminar);
System.out.println("Socio eliminado exitosamente.");
} else {
System.out.println("Socio no encontrado.");
}
}
public void mostrar() {
Collections.sort(socios, new Comparator<Socio>() {
@Override
public int compare(Socio s1, Socio s2) {
return Integer.compare(s1.getNumSocio(), s2.getNumSocio());
}
});
System.out.println("\n--- LISTA DE SOCIOS ---");
for (Socio socio : socios) {
System.out.println(socio);
}
}
public static void main(String[] args) {
ClubApp club = new ClubApp();
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("\n--- MENÚ CLUB DEPORTIVO ---");
System.out.println("1. Añadir socio");
System.out.println("2. Eliminar socio");
System.out.println("3. Mostrar socios");
System.out.println("4. Salir");
System.out.print("Seleccione una opción: ");
try {
opcion = Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("Error: Debe introducir un número");
opcion = 0;
continue;
}
switch (opcion) {
case 1:
try {
System.out.println("Tipo de socio:");
System.out.println("1. Regular");
System.out.println("2. Premium");
System.out.println("3. Infantil");
System.out.print("Seleccione tipo: ");
int tipo = Integer.parseInt(scanner.nextLine());
System.out.print("Nombre: ");
String nombre = scanner.nextLine();
System.out.print("Apellidos: ");
String apellidos = scanner.nextLine();
System.out.print("DNI: ");
int dni = Integer.parseInt(scanner.nextLine());
System.out.print("Email: ");
String email = scanner.nextLine();
System.out.print("Sexo (M/F): ");
char sexo = scanner.nextLine().toUpperCase().charAt(0);
System.out.print("Número de socio: ");
int numSocio = Integer.parseInt(scanner.nextLine());
System.out.print("Cuota mensual: ");
float cuotaMensual = Float.parseFloat(scanner.nextLine());
switch (tipo) {
case 1:
System.out.print("Beneficios básicos: ");
String beneficiosBasicos = scanner.nextLine();
SocioRegular socioReg = new SocioRegular(nombre, apellidos, dni, email, sexo, numSocio, cuotaMensual, beneficiosBasicos);
club.añadir(socioReg);
break;
case 2:
System.out.print("Beneficios básicos: ");
beneficiosBasicos = scanner.nextLine();
System.out.print("Beneficios premium: ");
String beneficiosPremium = scanner.nextLine();
SocioPremium socioPrem = new SocioPremium(nombre, apellidos, dni, email, sexo, numSocio, cuotaMensual, beneficiosBasicos, beneficiosPremium);
club.añadir(socioPrem);
break;
case 3:
System.out.println("Datos del tutor:");
System.out.print("Nombre del tutor: ");
String nombreTutor = scanner.nextLine();
System.out.print("Apellidos del tutor: ");
String apellidosTutor = scanner.nextLine();
System.out.print("DNI del tutor: ");
int dniTutor = Integer.parseInt(scanner.nextLine());
System.out.print("Email del tutor: ");
String emailTutor = scanner.nextLine();
System.out.print("Sexo del tutor (M/F): ");
char sexoTutor = scanner.nextLine().toUpperCase().charAt(0);
Usuario tutor = new Usuario(nombreTutor, apellidosTutor, dniTutor, emailTutor, sexoTutor);
SocioInfantil socioInf = new SocioInfantil(nombre, apellidos, dni, email, sexo, numSocio, cuotaMensual, tutor);
club.añadir(socioInf);
break;
}
} catch (Exception e) {
System.out.println("Error al añadir socio: " + e.getMessage());
}
break;
case 2:
// Eliminar socio
try {
System.out.println("\n--- ELIMINAR SOCIO ---");
System.out.print("Número de socio a eliminar: ");
int numSocio = Integer.parseInt(scanner.nextLine());
club.eliminar(numSocio);
} catch (Exception e) {
System.out.println("Error al eliminar socio: " + e.getMessage());
}
break;
case 3:
// Mostrar socios ordenados
club.mostrar();
break;
case 4:
// Salir
System.out.println("Saliendo del programa...");
break;
default:
System.out.println("Opción no válida");
}
} while (opcion != 4);
scanner.close();
}
}
Eliminar socio utilizando un Iterador
Una alternativa más segura para eliminar elementos de una colección durante su recorrido es el uso de un Iterator, que evita la excepción ConcurrentModificationException.
public void eliminar(int numSocio) {
Iterator<Socio> iterator = socios.iterator();
boolean encontrado = false;
while (iterator.hasNext()) {
Socio socio = iterator.next();
if (socio.getNumSocio() == numSocio) {
iterator.remove();
System.out.println("Socio eliminado exitosamente.");
encontrado = true;
break;
}
}
if (!encontrado) {
System.out.println("Socio no encontrado.");
}
}
Ejercicio 2: Quiz de Elementos Químicos
La clase ElementQuiz plantea un juego interactivo en el que el usuario debe adivinar el nombre de un elemento químico a partir de su símbolo. Los datos se almacenan en un HashMap.
public class ElementQuiz {
private static final Map<String, String> elementos = new HashMap<>();
static {
elementos.put("H", "Hidrógeno");
// ... resto de elementos
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
String[] simbolos = elementos.keySet().toArray(new String[0]);
System.out.println("¡Bienvenido al Quiz de Elementos Químicos!");
System.out.println("Adivina el nombre del elemento a partir de su símbolo.");
while (true) {
String simbolo = simbolos[random.nextInt(simbolos.length)];
String nombreElemento = elementos.get(simbolo);
System.out.println("\n¿Qué elemento tiene el símbolo \"" + simbolo + "\"?");
System.out.print("Tu respuesta: ");
String respuesta = scanner.nextLine().trim();
if (respuesta.equalsIgnoreCase(nombreElemento)) {
System.out.println("¡Correcto! " + simbolo + " es " + nombreElemento + ".");
} else {
System.out.println("Incorrecto. " + simbolo + " es " + nombreElemento + ".");
}
System.out.print("¿Quieres intentar con otro elemento? (s/n): ");
String continuar = scanner.nextLine().trim().toLowerCase();
if (!continuar.equals("s")) {
break;
}
}
System.out.println("¡Gracias por jugar!");
scanner.close();
}
}
Ejercicio 3: Gestión de Canciones con Set
La clase ControladorSet utiliza distintas implementaciones de la interfaz Set para gestionar una colección de canciones:
- HashSet: almacena las canciones sin un orden garantizado.
- TreeSet con Comparator: ordena las canciones por autor o grupo.
- Iterator: permite eliminar una canción concreta según su título y autor.
public class ControladorSet {
private Set<Cancion> canciones;
public ControladorSet() {
this.canciones = new HashSet<>();
}
public void mostrarPorInsercion() {
try {
Iterator<Cancion> iterator = this.canciones.iterator();
while (iterator.hasNext()) {
Cancion cancion = iterator.next();
System.out.println(cancion.toString());
}
} catch (Exception e) {
System.out.println("Error al mostrar canciones por inserción: " + e.getMessage());
}
}
public void mostrarPorAutor() {
try {
TreeSet<Cancion> cancionesOrdenadas = new TreeSet<>(new Comparator<Cancion>() {
@Override
public int compare(Cancion c1, Cancion c2) {
return c1.getAutorGrupo().compareTo(c2.getAutorGrupo());
}
});
cancionesOrdenadas.addAll(canciones);
for (Cancion cancion : cancionesOrdenadas) {
System.out.println(cancion);
}
} catch (Exception e) {
System.out.println("Error al mostrar canciones por autor: " + e.getMessage());
}
}
public void eliminarCancionActualmente() {
Scanner teclado = new Scanner(System.in);
System.out.print("Introduce el título de la canción a eliminar: ");
String tituloEliminar = teclado.nextLine();
System.out.print("Introduce el autor de la canción a eliminar: ");
String autorEliminar = teclado.nextLine();
Iterator<Cancion> iterator = this.canciones.iterator();
while (iterator.hasNext()) {
Cancion cancion = iterator.next();
if (cancion.getTitulo().equalsIgnoreCase(tituloEliminar)
&& cancion.getAutorGrupo().equalsIgnoreCase(autorEliminar)) {
iterator.remove();
break;
}
}
}
}