Saltar al contenido

¿Cómo mantener una lista única en Java?

Ya no tienes que investigar más en internet porque estás al sitio exacto, tenemos la respuesta que deseas y sin complicaciones.

Solución:

Puedes usar una implementación de Set:

Alguna información del JAVADoc:

Una colección que contiene sin elementos duplicados. Más formalmente, los conjuntos no contienen un par de elementos e1 y e2 tales que e1.equals(e2), y como máximo uno null elemento. Como implica su nombre, esta interfaz modela la abstracción de conjuntos matemáticos.

Nota: Se debe tener mucho cuidado si se utilizan objetos mutables como elementos fijos. El comportamiento de un conjunto no se especifica si el valor de un objeto cambia de una manera que afecta las comparaciones de igualdad mientras el objeto es un elemento del conjunto. Un caso especial de esta prohibición es que no está permitido que un conjunto se contenga a sí mismo como elemento.

Estas son las implementaciones:

  • HashSet

    Esta clase ofrece un rendimiento de tiempo constante para las operaciones básicas (agregar, eliminar, contener y dimensionar), suponiendo que la función hash dispersa los elementos correctamente entre los cubos. La iteración sobre este conjunto requiere un tiempo proporcional a la suma del tamaño de la instancia de HashSet (la cantidad de elementos) más la “capacidad” de la instancia de respaldo de HashMap (la cantidad de cubos). Por lo tanto, es muy importante no establecer la capacidad inicial demasiado alta (o el factor de carga demasiado bajo) si el rendimiento de la iteración es importante.

    Al iterar un HashSet el orden de los elementos producidos no está definido.

  • LinkedHashSet

    Implementación de tabla hash y lista enlazada de la interfaz Set, con orden de iteración predecible. Esta implementación se diferencia de HashSet en que mantiene una lista de enlaces dobles que se ejecuta en todas sus entradas. Esta lista enlazada define el orden de las iteraciones, que es el orden en que se insertaron los elementos en el conjunto (orden de inserción). Tenga en cuenta que el orden de inserción no se ve afectado si se vuelve a insertar un elemento en el conjunto. (Un elemento e se reinserta en un conjunto s si se invoca s.add(e) cuando s.contains(e) devolvería true inmediatamente antes de la invocación.)

    Entonces, la salida del código anterior…

     Set linkedHashSet = new LinkedHashSet<>();
     linkedHashSet.add(3);
     linkedHashSet.add(1);
     linkedHashSet.add(2);
    
     for (int i : linkedHashSet) 
         System.out.println(i);
     
    

    … será necesariamente

    3
    1
    2
    
  • ÁrbolConjunto

    Esta implementación proporciona un costo de tiempo de registro (n) garantizado para las operaciones básicas (agregar, eliminar y contener). De forma predeterminada, los elementos devueltos en la iteración se ordenan por su “ordenamiento natural”, por lo que el código anterior…

     Set treeSet = new TreeSet<>();
     treeSet.add(3);
     treeSet.add(1);
     treeSet.add(2);
    
     for (int i : treeSet) 
         System.out.println(i);
     
    

    … generará esto:

    1
    2
    3
    

    (También puede pasar un Comparator instancia a un TreeSet constructor, haciendo que clasifique los elementos en un orden diferente).

    Tenga en cuenta que el orden mantenido por un conjunto (ya sea que se proporcione o no un comparador explícito) debe ser consistente con los iguales si se va a implementar correctamente la interfaz del Conjunto. (Consulte Comparable o Comparator para obtener una definición precisa de consistente con iguales). Esto se debe a que la interfaz Set se define en términos de la operación de iguales, pero una instancia de TreeSet realiza todas las comparaciones de elementos utilizando su método compareTo (o compare), por lo que dos los elementos que se consideran iguales por este método son, desde el punto de vista del conjunto, iguales. El comportamiento de un conjunto está bien definido incluso si su ordenamiento es inconsistente con los iguales; simplemente no cumple con el contrato general de la interfaz Set.

Quiero aclarar algunas cosas aquí para el póster original al que otros han aludido pero que en realidad no lo han declarado explícitamente. Cuando dices que quieres una lista única, esa es la definición misma de un conjunto ordenado. Algún otro key Las diferencias entre la interfaz Set y la interfaz List son que List le permite especificar el índice de inserción. Entonces, la pregunta es: ¿realmente necesita la interfaz List (es decir, para compatibilidad con una biblioteca de terceros, etc.), o puede rediseñar su software para usar la interfaz Set? También debe considerar lo que está haciendo con la interfaz. ¿Es importante encontrar elementos por su índice? ¿Cuántos elementos esperas en tu conjunto? Si vas a tener muchos elementos, ¿es importante ordenar?

Si realmente necesita una Lista que solo tenga una restricción única, existe la clase org.apache.commons.collections.list.SetUniqueList de Apache Common Utils que le proporcionará la interfaz de Lista y la restricción única. Sin embargo, esto rompe la interfaz de la Lista. Sin embargo, obtendrá un mejor rendimiento de esto si necesita buscar en la lista por índice. Si puede manejar la interfaz Set y tiene un conjunto de datos más pequeño, LinkedHashSet podría ser una buena opción. Solo depende del diseño y la intención de su software.

Nuevamente, hay ciertas ventajas y desventajas en cada colección. Algunas inserciones rápidas pero lecturas lentas, algunas tienen lecturas rápidas pero inserciones lentas, etc. Tiene sentido pasar una buena cantidad de tiempo con la documentación de las colecciones para aprender completamente sobre los detalles más finos de cada clase e interfaz.

Utilizar new HashSet
Un ejemplo:

import java.util.HashSet;
import java.util.Set;

public class MainClass 
  public static void main(String args[]) 
    String[] name1 =  "Amy", "Jose", "Jeremy", "Alice", "Patrick" ;

    String[] name2 =  "Alan", "Amy", "Jeremy", "Helen", "Alexi" ;

    String[] name3 =  "Adel", "Aaron", "Amy", "James", "Alice" ;

    Set letter = new HashSet();

    for (int i = 0; i < name1.length; i++)
      letter.add(name1[i]);

    for (int j = 0; j < name2.length; j++)
      letter.add(name2[j]);

    for (int k = 0; k < name3.length; k++)
      letter.add(name3[k]);

    System.out.println(letter.size() + " letters must be sent to: " + letter);

  

Te mostramos las reseñas y valoraciones de los lectores

Recuerda algo, que tienes concesión de valorar este artículo si diste con el resultado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *