Colecoes

Conjuntos

Java Collections - Conjuntos

Uma java.util.Set é uma coleção que se destaca por garantir a exclusividade dos elementos em um conjunto, isso quer dizer, só poderá haver um elemento de mesmo valor ou referência com base nas regras de comparação.

NomeDescrição
HashSetUma coleção exclusiva e com alto desempenho
LinkedHashSetUma coleção exclusiva e ordenada pela inserção
TreeSetUma coleção exclusiva, ordenada e classificada pela ordem natural dos elementos

A partir de agora vamos explorar a proposta principal em se usar Set em um cenário aonde avaliaremos as particularidades de cada classe baseadas em contextos diferentes.

Uma universidade abriu o período de matrícula dos alunos para cursarem ADS - Análise e Desenvolvimento de Sistemas. Nesta primeira fase, o único requisito é que uma pessoa não possa estar repetidamente na lista de inscritos.

IMG

Conjuntos.java
import java.util.*;

public class Conjuntos {
    public static void main(String[] args) {
        HashSet inscritos = new HashSet();
        inscritos.add("Marcos");
        inscritos.add("Lucas");
        inscritos.add("Antonio");
        inscritos.add("Mirela");
        inscritos.add("Alessandra");
        inscritos.add("Felipe");
        inscritos.add("Sofia");
        // opa Lucas já fez a sua inscrição
        inscritos.add("Lucas");

        imprimirInscritos(inscritos);
        
        /**
         * Alessandra
         * Felipe
         * Mirela
         * Sofia
         * Marcos
         * Lucas
         * Antonio
         */
    }
    // não se assuste com o nível de abstração, em breve você vai entender
    static void imprimirInscritos(Collection inscritos){
        System.out.println("***Listando os inscritos***");
        for(Object inscrito: inscritos){
            System.out.println(inscrito);
        }
    }
}

Ao executar o nosso programa precisamos analisar duas características em se utilizar HashSet.

  1. Esta coleção garantiu a não duplicidade dos elementos
  2. Porém ela não considerou algum tipo de ordem, de interação ou classificação natural.

Por uma questão estratégia a universidade resolveu criar uma promoção para acelerar as inscrições aonde os 50 primeiros inscritos ganhariam 50% na matrícula. Neste contexto a ordem dos inscritos passará a ter relevância, logo, é recomendado usar LinkedHashSet para garantir esta ordem de inserção.

Execute o seu programa mais de uma vez para confirmar que os elementos serão impressos garantindo a ordem de inserção.

LinkedHashSet.java
Set inscritos = new LinkedHashSet();

inscritos.add("Marcos");
inscritos.add("Lucas");
inscritos.add("Antonio");
inscritos.add("Mirela");
inscritos.add("Alessandra");
inscritos.add("Felipe");
inscritos.add("Sofia");
// opa Lucas já fez a sua inscrição
inscritos.add("Lucas");

imprimirInscritos(inscritos);

Chegou o grande dia em dar a notícia aos alunos que foram selecionados para cursarem ADS e o administrativo solicitou que a lista de aprovados já retornasse os candidatos em ordem alfabética.

Existem algorítimos para realizar a classificação de uma coleção, porém neste primeiro momento, iremos explorar a proposta principal em se usar TreeSet.

TreeSet.java
Set inscritos = new TreeSet();
inscritos.add("Marcos");
inscritos.add("Lucas");
inscritos.add("Antonio");
inscritos.add("Mirela");
inscritos.add("Alessandra");
inscritos.add("Felipe");
inscritos.add("Sofia");

imprimirInscritos(inscritos);
🔔 Atenção
Você precisa ter ciência que este algorítimo de classificação automática em TreeSet exige um tempo de processamento, logo se a performance para inclusão for um requisito essencial, use HashSet e depois execute a classificação de toda a coleção. Veja uma alternativa abaixo.
HashSet.java
Set inscritos = new HashSet();
inscritos.add("Marcos");
inscritos.add("Lucas");
inscritos.add("Antonio");
inscritos.add("Mirela");
inscritos.add("Alessandra");
inscritos.add("Felipe");
inscritos.add("Sofia");

Set aprovados = new TreeSet(inscritos);

imprimirInscritos(aprovados);