Post Top Ad

Your Ad Spot

martes, 25 de junio de 2019

Colecciones Java: La interfaz Set

Introducción

El Java Collections Framework es un marco fundamental y esencial que cualquier desarrollador de Java sólido debe 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 las interfaces java.util.Collectionjava.util.MapEstas clases en su mayoría ofrecen diferentes formas de formular una colección de objetos dentro de un solo objeto.
Java Collections es un marco que proporciona numerosas operaciones en 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 Colecciones Java:
  • La interfaz de la lista
  • La interfaz de conjunto ( usted está aquí )
  • Colas, Deques, Stacks ( próximamente )
  • La interfaz del mapa ( próximamente )

Conjuntos

La siguiente interfaz común del framework es java.util.Set.
Los conjuntos no ofrecen métodos adicionales, aparte de los métodos heredados de la Collectioninterfaz.
Un Conjunto modela la abstracción del conjunto matemático 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 observar, la lista namescontiene entradas duplicadas, y el conjunto uniqueNameselimina las duplicadas y las imprime sin un orden específico.

Añadiendo un elemento

Usando el add()método, similar al de Listas, 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 dará como resultado:
[Adam, David, Jane, Scott, Usman]

Removiendo elementos

Usando el remove()método booleano , 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 usar 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 el 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()método acepta Collectionun argumento. Esto se puede usar para eliminar todos los elementos comunes de dos colecciones diferentes, en este caso a Listy a Set.
También tenga en cuenta que puede usar este método para eliminar todos los elementos del Collectionmismo:
uniqueName.removeAll(uniqueNames);  
Esto, por supuesto, terminará con un conjunto vacío. Sin embargo, este enfoque no es recomendable, ya que llamar al removeAll()método cuesta mucho más que el clear()método.
Esto se debe al removeAll()método que compara cada elemento individual de la colección de argumentos con la colección que llama al método, mientras que clear()simplemente los señala a todos nully establece el tamaño en 0.

Contiene el elemento

Usando el contains()método booleano con el objeto dado, podemos verificar si Setcontiene un elemento específico:
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 forenhanced-forbucles, es mejor usar las Colecciones de Java Iteratorpara 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 comprobació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(Llama hashCode()al elemento y busca la ubicación)
  • Buena implementación de propósito general (redimensiona cuando se queda sin espacio)
TreeSet :
  • Basado en TreeMap(utiliza un árbol binario con un orden de clasificación requerido)
  • Mantiene los elementos en el orden dado.
EnumSets :
  • Implementación especializada para enumeraciones (utiliza un conjunto de bits basado en el ordinal de la enumeración)
  • Utilícelo cuando almacene conjuntos de enumeraciones

Comparación algorítmica

performance_comparison_hashset_treeset_enumset

Conclusión

El marco de Java Collections es un marco fundamental que todo desarrollador de Java debe saber cómo usar.
En el artículo, hemos hablado sobre Set Interface y sus implementaciones, sus ventajas y desventajas, así como sobre las operaciones que seguramente utilizará en un momento u otro.
Si está interesado en leer más sobre las interfaces de colección, continúe leyendo - Colecciones de Java: colas, Deques y pilas ( próximamente ).

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas