Conjunto Java – 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 fornece controle sobre a posição onde você pode inserir um elemento. Você não pode acessar elementos pelo índice deles e também não pode procurar 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 no máximo um elemento nulo apenas.
  • A interface Set possui um método padrão no 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 o Set evitará ClassCastException em tempo de execução.
  • Podemos usar implementações da interface Set para manter elementos únicos.

Diagrama de Classe da Classe Java Set

A interface Set do Java estende a interface Collection. A interface Collection estende a interface Iterable. Algumas das classes de implementação de Set frequentemente usadas 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 do Set.

Métodos do Set Java

Nesta seção, discutiremos alguns dos métodos úteis do Set 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 true 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 uma matriz contendo todos os elementos deste conjunto. Se este conjunto fornecer alguma garantia quanto à ordem em que seus elementos são 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 ele 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): Reté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 deste conjunto.

Java Array para Set

Ao contrário da Lista, não podemos converter diretamente um Set Java em um array, pois ele NÃO é implementado usando um Array. Portanto, não podemos usar a classe Arrays para obter a visão do array como um conjunto. Podemos seguir outra abordagem. Podemos converter um array em uma Lista usando o método Arrays.asList(), e depois usá-lo para criar um Set. Usando esta abordagem, podemos converter um Array Java em 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 Set, conforme 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, crie um HashSet vazio, depois use 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 uma Matriz de Strings usando o método Set.toArray() conforme mostrado abaixo.

import java.util.*;

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

	// exemplo de adição
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// converter Set 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 em Java

Como sabemos, o Conjunto (HashSet) NÃO suporta a ordenação direta de elementos. Ele armazena e exibe seus elementos em ordem aleatória. No entanto, temos algumas abordagens para ordenar seus 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 de Conjuntos em Java

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

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 em índice em um Conjunto
	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 Conjunto em Java

Abaixo está um exemplo simples mostrando como iterar sobre um Conjunto em 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();
	
	//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);
	}
   }
}

Conversão de Conjunto em Java para Fluxo

Abaixo está um exemplo simples mostrando como converter um Conjunto em Java para um Fluxo e realizar algumas operações de acordo com 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");
		
	//converter conjunto para fluxo
	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 de utilidade úteis à interface Set. É melhor entendê-los com alguns exemplos simples e úteis. Por favor, consulte meu tutorial em “Java SE 9: Métodos de Fábrica para Sets” para aprendê-los. Isso conclui um resumo rápido sobre Set em Java. Espero que esses exemplos de conjuntos em Java ajudem você a começar a programar com coleções Set. Obrigado por ler meus tutoriais. Deixe um comentário se você gostou dos meus tutoriais ou se tiver algum problema, sugestão ou qualquer erro tipográfico.

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