John Squirrels
Nível 41
San Francisco

Conjunto Java

Publicado no grupo Random-PT
Set é uma interface no Java Collection Framework. Você pode usar o Java Set para implementar coleções não ordenadas com elementos exclusivos. Neste artigo, veremos essa interface e suas implementações na linguagem Java, métodos para trabalhar com um conjunto e também daremos alguns exemplos.

O que é Conjunto Java

Set é uma interface do Java Collection Framework, mas Set não é uma coleção ordenada, ao contrário de List . Isso significa que os elementos Java Set são mantidos sem uma ordem específica. Portanto, não há controle sobre a posição em que você pode inserir um elemento. Além disso, você não pode acessar elementos por seu índice. Matematicamente, um Conjunto é uma coleção de elementos únicos. Na verdade, trata-se de uma Coleção não ordenada (Unordered Collection), na qual elementos idênticos não podem ser armazenados. Se você adicionar intencionalmente um elemento duplicado a um Conjunto , esta ação será ignorada e o Conjunto não será alterado. No entanto, é permitido armazenar um elemento nulo nele.

Definir implementações

Java Set é uma interface, então você precisa usar uma de suas implementações para criar objetos. Estes são HashSet , TreeSet e LinkedHashSet . Em Set s, cada elemento é armazenado em apenas uma instância, e diferentes implementações de Set usam uma ordem diferente para armazenar elementos. Em um HashSet , a ordem dos elementos é determinada por um algoritmo complexo. Se a ordem de armazenamento for importante para você, use um contêiner TreeSet , que armazena objetos classificados em ordem crescente em ordem de comparação, ou um LinkedHashSet, que armazena elementos em ordem de adição. Os conjuntos geralmente são usados ​​para testes de associação, para que você possa verificar facilmente se um objeto pertence a um determinado conjunto; portanto, na prática, geralmente é escolhida uma implementação de HashSet otimizada para pesquisa rápida. HashSet é uma coleção que usa seus valores de hash retornados pelo método hashCode() para armazenar elementos internamente. Ou seja, dentro do HashSet<E> , é armazenado o objeto HashMap<E, Object> , que armazena os valores do HashSet como chaves. O uso de códigos hash permite que você pesquise, adicione e remova rapidamente elementos de um Conjunto . LinkedHashSet é um HashSetque também armazena elementos em uma lista encadeada. Um HashSet normal não mantém a ordem dos elementos. Em primeiro lugar, oficialmente simplesmente não existe e, em segundo lugar, até mesmo a ordem interna pode mudar drasticamente quando apenas um elemento é adicionado. E você pode obter um iterador de LinkedHashSet e usá-lo para percorrer todos os elementos na ordem exata em que foram adicionados ao LinkedHashSet . Não é frequente, mas às vezes pode ser muito necessário. Um TreeSet é uma coleção que armazena elementos como uma árvore ordenada por valor. Dentro do TreeSet<E> está um TreeMap<E, Object> que armazena todos esses valores. E este TreeMapusa uma árvore binária balanceada vermelho-preto para armazenar elementos. Portanto, ele possui operações add() , remove() , contains() muito rápidas .

Criar um objeto de conjunto

Para criar um Set Object, você pode usar um dos seguintes formulários:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Aqui está um exemplo simples, onde criamos 2 Set s, HashSet e LinkedHashSet e adicionamos 5 elementos a cada um. Podemos usar o método add() para isso.
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
Aqui está a saída do programa:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Como mencionamos acima, o HashSet não mantém a ordem dos elementos, mas o LinkedHashSet sim. Foi LinkedHashSet que nos deu os elementos na ordem em que os escrevemos no conjunto.

Métodos de conjunto de Java

Aqui estão alguns dos métodos importantes do Java Set :
  • adição booleana(E e) . Adiciona o elemento especificado ao conjunto se ainda não estiver presente (operação opcional).

  • boolean remove(Objeto o) . Remove o elemento especificado deste conjunto se estiver presente (operação opcional).

  • boolean removeAll(Coleção c) . Remove deste conjunto todos os seus elementos contidos na coleção especificada (operação opcional).

  • boolean reterAll(Coleção c) . Retém apenas os elementos neste conjunto que estão contidos na coleção especificada (operação opcional).

  • void limpar() . Remove todos os elementos do conjunto.

  • Iterator iterator() . Retorna um iterador sobre os elementos neste conjunto.

  • int tamanho() . é usado para obter o número de elementos no conjunto.

  • booleano isEmpty() . para verificar se Set está vazio ou não.

  • boolean contém(Objeto o) . Retorna true se este Set contiver o elemento especificado.

  • Iterator iterator() . Retorna um iterador sobre os elementos neste conjunto. Os elementos são retornados em nenhuma ordem específica.

  • Object[] toArray() . Retorna uma matriz contendo todos os elementos neste conjunto. Se esse conjunto fizer qualquer garantia quanto à ordem em que seus elementos são retornados por seu iterador, esse método deverá retornar os elementos na mesma ordem.

Os métodos são semelhantes aos de ArrayList , exceto que o método add(Object o) apenas adiciona um objeto ao conjunto se ele ainda não estiver lá. O valor de retorno do método é true se o objeto foi adicionado e false caso contrário. Existem também alguns métodos herdados da interface Collection<> : parallelStream() , removeIf() , stream() e forEach() método herdado da interface java.lang.Iterable .

Java Set exemplo de operações principais

Neste exemplo, criamos um array de strings e o passamos para mySet usando a operação Arrays.asList . Em seguida, removemos mais alguns elementos e adicionamos mais alguns. Nesse caso, um dos elementos do conjunto já existe: não será adicionado. Também tentaremos as operações de verificação de vazio isEmpty() , determinando o tamanho do conjunto size() e limpando o conjunto de todos os elementos clear() .
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
A saída do programa está aqui:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] A quantidade de elementos do conjunto = 5 MySet está vazio? false O Igor está no set? false O Johnny está no set? true MySet está vazio agora? verdadeiro

Exemplo com LinkedHashSet e definido como Array

Vamos escrever outro programa. Nele, criaremos um conjunto baseado no LinkedHashSet , adicionaremos elementos a ele e depois converteremos o conjunto em um array.
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
Aqui está a saída do programa:
[C, D, E, F, G, A, B] false Imprime nosso conjunto com os elementos removidos: [C, D, E, G, A, B] Nova matriz do conjunto: [C, D, E, G, A,B]C

Definir exemplo com iterador

Vamos criar um conjunto, imprimi-lo usando um iterador e remover todos os números pares dele, também usando um iterador.
import java.util.*;

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

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
A saída do programa está aqui:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Exemplo com TreeSet

Se a classificação for importante para você, use a implementação TreeSet . Neste pequeno exemplo, iremos preencher o set com nomes de amigos, como nos exemplos anteriores. No entanto, em um TreeSet classificado , os elementos serão imediatamente escritos na ordem de classificação. Nesse caso, os nomes serão exibidos em ordem alfabética.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
A saída é:
[Alex, Bel, Igor, Johnny, Stuart]

Breves conclusões

  • A interface Java Set faz parte do Java Collections Framework.

  • Classes implementadas: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • As implementações de Set mais populares são HashSet , LinkedHashSet e TreeSet .

  • A ordem do elemento HashSet é determinada por um algoritmo complexo. Se a ordem de armazenamento for importante para você, use um contêiner TreeSet , que armazena objetos classificados em ordem crescente em ordem de comparação, ou um LinkedHashSet , que armazena elementos em ordem adicional.

  • Na maioria das vezes, os conjuntos são usados ​​para testar a associação. Ou seja, verificar se um objeto pertence a um determinado conjunto no sentido matemático. Então, na maioria das vezes, de todas as implementações de Set na prática, o HashSet é geralmente escolhido. Essa implementação é otimizada para pesquisa rápida.

  • Você não pode adicionar elementos duplicados a um conjunto, portanto, pode usar implementações da interface Conjunto para armazenar elementos exclusivos.

  • Set permite adicionar apenas um elemento nulo.

  • Set não é uma lista e não suporta índices ou posições de seus elementos.

Comentários
  • Populares
  • Novas
  • Antigas
Você precisa acessar para deixar um comentário
Esta página ainda não tem nenhum comentário