Conjunto de Java – Conjunto en Java

El conjunto de Java es una colección de elementos (u objetos) que no contiene elementos duplicados. Java Set es una interfaz que extiende la interfaz Collection. A diferencia de List, Java Set NO es una colección ordenada, sus elementos NO tienen un orden particular. Java Set NO proporciona un control sobre la posición donde se puede insertar un elemento. No puedes acceder a los elementos por su índice y tampoco buscar elementos en la lista.

Java Set

En esta sección, discutiremos algunos de los puntos importantes sobre Java Set:

  • La interfaz Java Set es un miembro del Marco de Colecciones de Java.
  • A diferencia de List, Set NO PERMITE agregar elementos duplicados.
  • Set permite agregar como máximo un elemento nulo solamente.
  • La interfaz Set tiene un método predeterminado en Java 8: spliterator.
  • A diferencia de List y arrays, Set NO admite índices o posiciones de sus elementos.
  • Set admite Genéricos y deberíamos usarlos siempre que sea posible. Usar Genéricos con Set evitará ClassCastException en tiempo de ejecución.
  • Podemos usar implementaciones de la interfaz Set para mantener elementos únicos.

Diagrama de Clase de la Clase Set de Java

La interfaz Set de Java extiende la interfaz Collection. La interfaz Collection extiende la interfaz Iterable. Algunas de las clases de implementación de Set más utilizadas son HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet y ConcurrentSkipListSet. AbstractSet proporciona una implementación esquelética de la interfaz Set para reducir el esfuerzo en su implementación.

Métodos de la Clase Set de Java

En esta sección discutiremos algunos de los métodos útiles de la clase Set de Java:

  1. int size(): para obtener el número de elementos en el Set.
  2. boolean isEmpty(): para verificar si el Set está vacío o no.
  3. boolean contains(Object o): devuelve true si este Set contiene el elemento especificado.
  4. Iterator iterator(): devuelve un iterador sobre los elementos de este conjunto. Los elementos se devuelven sin un orden particular.
  5. Object[] toArray(): devuelve un array conteniendo todos los elementos de este conjunto. Si este conjunto garantiza algún orden en cómo sus elementos son devueltos por su iterador, este método debe devolver los elementos en el mismo orden.
  6. boolean add(E e): Agrega el elemento especificado a este conjunto si aún no está presente (operación opcional).
  7. boolean remove(Object o): Elimina el elemento especificado de este conjunto si está presente (operación opcional).
  8. boolean removeAll(Collection c): Elimina de este conjunto todos sus elementos que están contenidos en la colección especificada (operación opcional).
  9. boolean retainAll(Collection c): Retiene solo los elementos en este conjunto que están contenidos en la colección especificada (operación opcional).
  10. void clear(): Elimina todos los elementos del conjunto.
  11. Iterator iterator(): Devuelve un iterador sobre los elementos de este conjunto.

Java Array to Set

A diferencia de List, no podemos convertir directamente un conjunto de Java en un array, ya que NO está implementado utilizando un Array. Por lo tanto, no podemos usar la clase Arrays para obtener la vista del array como conjunto. Podemos seguir otro enfoque. Podemos convertir un array en List usando el método Arrays.asList(), luego usarlo para crear un conjunto. Al utilizar este enfoque, podemos convertir un Array de Java a Set de dos maneras. Vamos a discutirlas una por una usando un ejemplo simple. Enfoque-1 En este enfoque, primero necesitamos crear una Lista usando el array dado y usarla para crear un Set como se muestra a continuación.

import java.util.*;

public class ArrayToSet {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
	System.out.println(vowelsSet);
	
	/**
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

Enfoque-2 En este enfoque, NO usamos una lista intermedia para crear un conjunto a partir de un arreglo. Primero creamos un HashSet vacío, luego usamos Collections.addAll() para copiar los elementos del arreglo en el conjunto dado como se muestra a continuación.

import java.util.*;

public class ArrayToSet2 {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet<>();
	Collections.addAll(vowelsSet, vowels); 
	System.out.println(vowelsSet);

	/** 
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

Salida:- Cuando ejecutamos los dos programas anteriores, obtendremos la misma salida como se muestra a continuación.

[a, e, u, i, o]
[a, u, i, o]
[]

Conjunto Java a Arreglo

En esta sección, escribiremos un programa para convertir un conjunto de cadenas en un arreglo de cadenas usando el método Set.toArray() como se muestra a continuación.

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set();

	// agregar ejemplo
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convertir Set a Arreglo
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

Salida:- Cuando ejecutamos el programa anterior, obtendremos la siguiente salida como se muestra a continuación.

[a, e, u, i, o]

Ordenamiento de Conjunto Java

Como sabemos, el conjunto (HashSet) NO admite ordenar elementos directamente. Almacena y muestra sus elementos en orden aleatorio. Sin embargo, tenemos algunos enfoques para ordenar sus elementos como se muestra a continuación:

import java.util.*;

public class SetSortingExample {

	public static void main(String[] args) {
		Set<Integer> intsSet = new HashSet<>();
		Random random = new Random();
		for (int i = 0; i  {return (o2-o1);});
		System.out.println("Reverse Sorting: " + intsList2);

		// Approach-3
		Set<Integer> sortedSet = new TreeSet<>(intsSet);
		System.out.println("Sorted Set: " + sortedSet);
	}
}

Salida:- Cuando ejecutamos el programa anterior, veremos la siguiente salida.

[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]

Operaciones Comunes de Conjuntos en Java

Las operaciones más comunes realizadas en un conjunto de Java son agregar, agregarTodos, limpiar, tamaño, etc. A continuación se muestra un ejemplo simple de un conjunto de Java que muestra el uso de métodos comunes.

import java.util.*;

public class SetCommonOperations 
{
   public static void main(String args[]) 
   {
	Set vowels= new HashSet<>();
		
	//ejemplo de agregar
	vowels.add("A");
	vowels.add("E");
	vowels.add("I");

	//No podemos insertar elementos basados en índice a un conjunto
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//añadiendo elementos de un conjunto a letras
	vowels.addAll(set);
	System.out.println(vowels);
	
	//ejemplo de limpiar para vaciar el conjunto
	set.clear();
		
	//ejemplo de tamaño
	System.out.println("letters set size = " + vowels.size());
		
	vowels.clear();
	vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
	System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
		
   }
}

Salida:-

[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true

Iterador de Conjunto en Java

A continuación se muestra un ejemplo simple que muestra cómo iterar sobre un conjunto de Java.

import java.util.*;

public class SetIteratorExample
{
   public static void main(String[] args) 
   {

	Set set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	//iteración simple
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	//modificación del conjunto usando el iterador
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//cambiando la estructura del conjunto mientras se itera
	iterator = set.iterator();
	while(iterator.hasNext()){
                //ConcurrentModificationException aquí
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Conversión de Conjunto en Java a Secuencia

A continuación se muestra un ejemplo simple que muestra cómo convertir un conjunto de Java a una secuencia y realizar algunas operaciones según nuestros requisitos.

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set vowelsSet = new HashSet<>();
	//ejemplo de agregar
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convertir conjunto a secuencia
	vowelsSet.stream().forEach(System.out::println);
   }
}

Salida:-

a
e
u
i
o

Java SE 9 Set

En la versión Java SE 9, Oracle Corp va a añadir algunos métodos de utilidad útiles a la interfaz Set. Es mejor entenderlos con algunos ejemplos simples y útiles. Por favor, consulta mi tutorial en “Java SE 9: Métodos de Fábrica Set” para aprenderlos. Eso es todo para un resumen rápido sobre Set en Java. Espero que estos ejemplos de Set en Java te ayuden a empezar con la programación de colecciones Set. Gracias por leer mis tutoriales. Por favor, déjame un comentario si te gustan mis tutoriales o tienes algún problema, sugerencia o error tipográfico.

Source:
https://www.digitalocean.com/community/tutorials/java-set