📌 Introducción
En esta práctica vamos a trabajar con la interfaz Set de Java, una estructura de datos fundamental dentro del framework de colecciones que se caracteriza por no permitir elementos duplicados.
A lo largo del ejercicio veremos:
- Eliminación de duplicados
- Detección de elementos repetidos
- Operaciones entre conjuntos
- Ordenación automática con
TreeSet - Navegación avanzada con
NavigableSet - Uso de objetos personalizados con
Set
🔹 Clase Usuario
Primero definimos una clase Usuario que utilizaremos en la última parte:
class Usuario {
String nombre;
int edad;
public Usuario(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Usuario)) return false;
Usuario u = (Usuario) o;
return nombre.equals(u.nombre);
}
@Override
public int hashCode() {
return nombre.hashCode();
}
@Override
public String toString() {
return nombre + " (" + edad + ")";
}
}
📌 En este caso, dos usuarios se consideran iguales si tienen el mismo nombre.
🔹 Parte 1: Eliminación de duplicados
String[] usuarios = {"Ana", "Luis", "Carlos", "Ana", "Pedro", "Luis", "Marta"};
Set<String> unicos = new HashSet<>(Arrays.asList(usuarios));
System.out.println("Usuarios únicos: " + unicos);
System.out.println("Total únicos: " + unicos.size());
👉 HashSet elimina automáticamente los duplicados.
🔹 Parte 2: Detección de duplicados
Set<String> uniques = new HashSet<>();
Set<String> duplicados = new HashSet<>();
for (String u : usuarios) {
if (!uniques.add(u)) {
duplicados.add(u);
}
}
👉 Si add() devuelve false, significa que el elemento ya existía.
🔹 Parte 3: Operaciones entre conjuntos
Set<String> grupoA = new HashSet<>(Arrays.asList("Ana", "Luis", "Carlos"));
Set<String> grupoB = new HashSet<>(Arrays.asList("Carlos", "Marta", "Pedro"));
Set<String> union = new HashSet<>(grupoA);
union.addAll(grupoB);
Set<String> interseccion = new HashSet<>(grupoA);
interseccion.retainAll(grupoB);
Set<String> diferencia = new HashSet<>(grupoA);
diferencia.removeAll(grupoB);
👉 Estas operaciones representan:
- Unión
- Intersección
- Diferencia
🔹 Parte 4: Ordenación con TreeSet
SortedSet<String> ordenados = new TreeSet<>(Arrays.asList(usuarios));
System.out.println("Ordenados: " + ordenados);
System.out.println("Primero: " + ordenados.first());
System.out.println("Ultimo: " + ordenados.last());
👉 TreeSet mantiene los elementos ordenados automáticamente.
🔹 Parte 5: Rangos
SortedSet<String> rango = ordenados.subSet("C", "P");
System.out.println("Entre C y P: " + rango);
👉 subSet() permite trabajar con subconjuntos por rango.
🔹 Parte 6: NavigableSet
NavigableSet<String> nav = new TreeSet<>(Arrays.asList("Ana", "Carlos", "Luis", "Marta", "Pedro"));
System.out.println("lower(Luis): " + nav.lower("Luis"));
System.out.println("floor(Luis): " + nav.floor("Luis"));
System.out.println("higher(Luis): " + nav.higher("Luis"));
System.out.println("ceiling(Luis): " + nav.ceiling("Luis"));
👉 Permite navegación avanzada dentro del conjunto.
🔹 Parte 7: Objetos personalizados con TreeSet
Set<Usuario> usuariosSet = new TreeSet<>(Comparator.comparingInt(u -> u.edad));
usuariosSet.add(new Usuario("Ana", 30));
usuariosSet.add(new Usuario("Luis", 25));
usuariosSet.add(new Usuario("Carlos", 35));
usuariosSet.add(new Usuario("Ana", 40));
👉 Se ordenan por edad automáticamente.
📌 Importante: si dos usuarios tienen la misma edad, el TreeSet puede considerarlos duplicados.
🎯 Conclusión
En esta práctica hemos aprendido:
- Cómo evitar duplicados con
Set - Cómo realizar operaciones entre conjuntos
- Diferencias entre
HashSetyTreeSet - Cómo trabajar con conjuntos ordenados
- Uso de comparadores en estructuras avanzadas
🚀 Recomendación
Practica modificando este código:
- Añade más campos a
Usuario - Cambia el criterio de ordenación
- Prueba con números en lugar de Strings
Esto te ayudará a dominar completamente las estructuras Set en Java.
Contenido restringido
Comments are closed