Java Set – Conjunto em Java

O Java Set é uma coleção de elementos (ou objetos) que não contém elementos duplicados. O Java Set é uma interface que estende a interface Collection. Ao contrário da List, o Java Set NÃO é uma coleção ordenada, seus elementos NÃO possuem uma ordem específica. O Java Set NÃO permite controlar a posição em que você pode inserir um elemento. Você não pode acessar elementos pelo índice nem pesquisar elementos na lista.

O Java Set

Nesta seção, discutiremos alguns pontos importantes sobre o Java Set:

  • A interface Java Set é um membro do Framework de Coleções do Java.
  • Ao contrário da List, o Set NÃO permite adicionar elementos duplicados.
  • O Set permite adicionar apenas um elemento nulo.
  • A interface Set possui um método padrão em Java 8: spliterator.
  • Ao contrário da List e dos arrays, o Set não suporta índices ou posições de seus elementos.
  • O Set suporta Genéricos e devemos usá-lo sempre que possível. Usar Genéricos com Set evitará ClassCastException em tempo de execução.
  • Podemos usar implementações da interface Set para manter elementos únicos.

Diagrama de Classe da Classe Set em Java

A interface Set em Java estende a interface Collection. A interface Collection, por sua vez, estende a interface Iterable. Algumas das classes de implementação de Set frequentemente utilizadas são HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet e ConcurrentSkipListSet. AbstractSet fornece uma implementação esquelética da interface Set para reduzir o esforço na implementação de um Set.

Métodos da Interface Set em Java

Nesta seção, discutiremos alguns dos métodos úteis da interface Set em Java:

  1. int size(): para obter o número de elementos no Set.
  2. boolean isEmpty(): para verificar se o Set está vazio ou não.
  3. boolean contains(Object o): Retorna verdadeiro se este Set contiver o elemento especificado.
  4. Iterator iterator(): Retorna um iterador sobre os elementos deste conjunto. Os elementos são retornados em nenhuma ordem específica.
  5. Object[] toArray(): Retorna um array contendo todos os elementos deste conjunto. Se este conjunto garantir qualquer ordem para os elementos retornados pelo seu iterador, este método deve retornar os elementos na mesma ordem.
  6. boolean add(E e): Adiciona o elemento especificado a este conjunto se ele ainda não estiver presente (operação opcional).
  7. boolean remove(Object o): Remove o elemento especificado deste conjunto se estiver presente (operação opcional).
  8. boolean removeAll(Collection c): Remove deste conjunto todos os elementos que estão contidos na coleção especificada (operação opcional).
  9. boolean retainAll(Collection c): Mantém apenas os elementos neste conjunto que estão contidos na coleção especificada (operação opcional).
  10. void clear(): Remove todos os elementos do conjunto.
  11. Iterator iterator(): Retorna um iterador sobre os elementos neste conjunto.

Array Java para Set

Ao contrário de uma Lista, não podemos converter diretamente um Conjunto Java em um array, pois ele NÃO é implementado usando um Array. Portanto, não podemos usar a classe Arrays para obter a visualização de array como conjunto. Podemos seguir outra abordagem. Podemos converter um array em uma Lista usando o método Arrays.asList(), e então usá-lo para criar um Conjunto. Usando essa abordagem, podemos converter um Array Java para Set de duas maneiras. Vamos discuti-las uma por uma usando um exemplo simples. Abordagem-1 Nesta abordagem, primeiro precisamos criar uma Lista usando o array fornecido e usá-la para criar um Conjunto, como mostrado abaixo.

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);
   }
}

Abordagem-2 Nesta abordagem, NÃO usamos uma Lista intermediária para criar um Conjunto a partir de uma Matriz. Primeiro, criamos um HashSet vazio e, em seguida, usamos Collections.addAll() para copiar os elementos da matriz para o Conjunto fornecido, conforme mostrado abaixo.

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);
   }
}

Saída:- Quando executamos os dois programas acima, obteremos a mesma saída conforme mostrado abaixo.

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

Java Set para Array

Nesta seção, escreveremos um programa para converter um Conjunto de Strings em um Array de String usando o método Set.toArray(), conforme mostrado abaixo.

import java.util.*;

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

	// adicione o exemplo 
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// converter Conjunto para Array 
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

Saída:- Quando executamos o programa acima, obteremos a seguinte saída conforme mostrado abaixo.

[a, e, u, i, o]

Ordenação de Conjunto Java

Como sabemos, Set (HashSet) NÃO suporta a ordenação de elementos diretamente. Ele armazena e exibe os elementos em ordem aleatória. No entanto, temos algumas abordagens para classificar os elementos, conforme mostrado abaixo:

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);
	}
}

Saída:- Quando executamos o programa acima, veremos a seguinte saída.

[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]

Operações Comuns em Java Set

As operações mais comuns realizadas em Java Set são adicionar, adicionarTodos, limpar, tamanho, etc. Abaixo está um exemplo simples de Java Set mostrando o uso comum dos métodos.

import java.util.*;

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

	//Não podemos inserir elementos com base no índice em um Set
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//anexando elementos do conjunto às letras
	vowels.addAll(set);
	System.out.println(vowels);
	
	//exemplo de limpeza para esvaziar o conjunto
	set.clear();
		
	//exemplo de tamanho
	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"));
		
   }
}

Saída:-

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

Iterador de Java Set

Abaixo está um exemplo simples mostrando como iterar sobre um Java Set.

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();
	
	//iteração simples
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	//modificação do conjunto usando o iterador
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//alterando a estrutura do conjunto durante a iteração
	iterator = set.iterator();
	while(iterator.hasNext()){
                //ConcurrentModificationException aqui
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Java Set para Stream

Abaixo está um exemplo simples mostrando como converter um Java Set para Stream e realizar algumas operações conforme nossos requisitos.

import java.util.*;

public class SetToStream {

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

Saída:-

a
e
u
i
o

Java SE 9 Set

No lançamento do Java SE 9, a Oracle Corp vai adicionar alguns métodos utilitários úteis à interface Set. É melhor entendê-los com alguns exemplos simples e úteis. Por favor, passe pelo meu tutorial em “Java SE 9: Métodos de Fábrica Set” para aprendê-los. Isso resume rapidamente o uso do Set em Java. Espero que esses exemplos de Set em Java ajudem você a começar a programar com coleções Set. Obrigado por ler meus tutoriais. Por favor, deixe um comentário se você gostou dos meus tutoriais ou se tiver alguma dúvida, sugestão ou erro tipográfico.

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