Colecciones Java: la interfaz de conjuntos

    Introducci贸n

    los Marco de colecciones de Java es un marco fundamental y esencial que cualquier desarrollador de Java fuerte deber铆a conocer como la palma de su mano.

    Una colecci贸n en Java se define como un grupo o colecci贸n de objetos individuales que act煤an como un solo objeto.

    Hay muchas clases de colecci贸n en Java y todas ellas extienden el java.util.Collection y java.util.Map interfaces. En su mayor铆a, estas clases ofrecen diferentes formas de formular una colecci贸n de objetos dentro de un solo objeto.

    Colecciones de Java es un marco que proporciona numerosas operaciones sobre una colecci贸n: b煤squeda, clasificaci贸n, inserci贸n, manipulaci贸n, eliminaci贸n, etc.

    Esta es la primera parte de una serie de art铆culos de las colecciones de Java:

    • La interfaz de lista
    • La interfaz de conjunto (est谩s aqu铆)
    • La interfaz del mapa
    • Las interfaces Queue y Deque

    Conjuntos

    La siguiente interfaz com煤n del marco es java.util.Set.

    Los conjuntos no ofrecen m茅todos adicionales, aparte de los m茅todos heredados de Collection interfaz.

    Un conjunto modela la abstracci贸n matem谩tica del conjunto y no puede contener elementos duplicados. Dicho esto, tambi茅n vale la pena se帽alar que estos elementos no tienen un orden espec铆fico dentro del conjunto:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    System.out.println(names);
    
    Set<String> uniqueNames = new HashSet<>(names);
    System.out.println(uniqueNames);
    

    Ejecutar este fragmento de c贸digo producir铆a:

    [David, Scott, Adam, Jane, Scott, David, Usman]
    [Adam, David, Jane, Scott, Usman]
    

    Como puede notar, la lista names contiene entradas duplicadas, y el conjunto uniqueNames elimina los duplicados y los imprime sin un orden espec铆fico.

    Agregar un elemento

    Utilizando el add() m茅todo, similar a Lists podemos agregar objetos a Set:

    Set<String> uniqueNames = new HashSet<>();
    uniqueNames.add("David");
    uniqueNames.add("Scott");
    uniqueNames.add("Adam");
    uniqueNames.add("Jane");
    uniqueNames.add("Scott");
    uniqueNames.add("David");
    uniqueNames.add("Usman");
    
    System.out.println(uniqueNames);
    

    Ejecutar este fragmento de c贸digo producir谩:

    [Adam, David, Jane, Scott, Usman]
    

    Eliminar elementos

    Usando el booleano remove() m茅todo, podemos eliminar el elemento especificado de este conjunto si est谩 presente:

    System.out.println(uniqueNumbers.remove(2));
    
    System.out.println(uniqueNumbers);
    

    Salida:

    true
    [1, 3]
    

    Otra opci贸n es utilizar el clear() m茅todo para eliminar todos los elementos del Conjunto:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    Set<String> uniqueNames = new HashSet<>(names);
    
    uniqueNames.clear();
    System.out.println(uniqueNames);
    

    Ejecutar este fragmento de c贸digo producir铆a:

    []
    

    Alternativamente, podr铆amos confiar en removeAll() m茅todo:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    List<String> newNames = Arrays.asList("David", "Adam");
    Set<String> uniqueNames = new HashSet<>(names);
    
    uniqueNames.removeAll(newNames);
    System.out.println(uniqueNames);
    

    Ejecutar este fragmento de c贸digo producir铆a:

    [Jane, Scott, Usman]
    

    Es importante notar que el removeAll() el m茅todo acepta un Collection como argumento. Esto se puede utilizar para eliminar todos los elementos comunes de dos colecciones diferentes, en este caso un List y un Set.

    Tambi茅n tenga en cuenta que puede utilizar este m茅todo para eliminar todos los elementos del Collection s铆 mismo:

    uniqueName.removeAll(uniqueNames);
    

    Esto, por supuesto, terminar谩 con un conjunto vac铆o. Sin embargo, este enfoque no se recomienda para llamar al removeAll() El m茅todo cuesta mucho m谩s que el clear() m茅todo.

    Esto se debe a la removeAll() m茅todo que compara cada elemento de la colecci贸n de argumentos con la colecci贸n que llama al m茅todo mientras que clear() simplemente los apunta a todos a null y establece el tama帽o en 0.

    Contiene el elemento

    Usando el booleano contains() m茅todo con el objeto dado, podemos comprobar si esto Set contiene un elemento especificado:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    Set<String> uniqueNames = new HashSet<>(names);
    
    System.out.println(uniqueNames.contains("David"));
    System.out.println(uniqueNames.contains("Scott"));
    System.out.println(uniqueNames.contains("Adam"));
    System.out.println(uniqueNames.contains("Andrew"));
    

    Ejecutar este c贸digo producir铆a:

    true
    true
    true
    false
    

    Elementos iterativos

    Lo mismo que con las listas, aunque es posible iterar con for y enhanced-for bucles, es mejor usar las colecciones de Java ‘ Iterator para esta tarea:

    Set<E> set = new TreeSet<E>();
    ...
    for(Iterator<E> iterator = set.iterator(); iterator.hasNext()) {
        E element = iterator.next();
        element.someMethod();
        iterator.remove(element);
    }
    

    Adem谩s, Java 8 nos presenta una forma realmente sencilla de imprimir los elementos utilizando referencias de m茅todos:

    set.forEach(System.out::println);
    

    Recuperando tama帽o

    Si desea recuperar el tama帽o de un conjunto:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    Set<String> uniqueNames = new HashSet<>(names);
    
    System.out.println(uniqueNames.size());
    

    Ejecutar este fragmento de c贸digo producir铆a:

    5
    

    Comprobando si est谩 vac铆o

    Si desea ejecutar una verificaci贸n para ver si un conjunto est谩 vac铆o o no antes de realizar cualquier operaci贸n en 茅l:

    List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman");
    Set<String> uniqueNames = new HashSet<>(names);
    
    System.out.println(uniqueNames.isEmpty());
    

    Ejecutar este fragmento de c贸digo producir铆a:

    false
    

    Implementaciones y diferencias

    HashSet:

    • Basado en HashMap (Llamadas hashCode() en el elemento y busca la ubicaci贸n)
    • Buena implementaci贸n de prop贸sito general (cambia de tama帽o cuando se queda sin espacio)

    TreeSet:

    • Basado en TreeMap (Utiliza un 谩rbol binario con un orden de clasificaci贸n obligatorio)
    • Mantiene los elementos en el orden dado

    EnumSets:

    • Implementaci贸n especializada para enumeraciones (usa un conjunto de bits basado en el ordinal de la enumeraci贸n)
    • Usar al almacenar conjuntos de enumeraciones

    Comparaci贸n algor铆tmica

    Conclusi贸n

    El marco de las Colecciones de Java es un marco fundamental que todo desarrollador de Java deber铆a saber utilizar.

    En el art铆culo, hemos hablado de la interfaz de conjunto y sus implementaciones, sus ventajas y desventajas, as铆 como las operaciones que seguramente usar谩 en un momento u otro.

    Si est谩 interesado en leer m谩s sobre las interfaces de colecci贸n, contin煤e leyendo – Colecciones Java: Colas, Deques y Pilas (pr贸ximamente).

     

    Etiquetas:

    Deja una respuesta

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