Quando Usar Coleções - Parte IV

 

Os objetos do grupo Set têm o objetivo de não permitir a duplicação de elementos. Estes objetos tratam os elementos como se fossem parte de um conjunto matemático, no qual independente da ordem em que elementos são acrescentados eles nunca serão duplicados.

 

Conjuntos são extensamente usados pra representação de dados. Com base nisso podemos dizer que  uma turma pode ser considerada um conjunto de alunos, uma aplicação java pode ser considerada um conjunto de classes java, e daí por diante.

 

Como vimos na escola, conjuntos podem ser vazios, mas não infinitos, visto que sua representação seria impossível. O tamanho de um conjunto pode variar dinamicamente, não sendo necessário prover seu tamanho, alem disso objetos em conjunto geralmente não são ordenados explicitamente, assim sendo a ordem que foi inseridos não é mantida internamente.

 

Conjuntos em Java são encapsulados por uma instância de uma das classes que implementam Set. Esta por sua vez declara vários métodos que possibilitam a inclusão e remoção de objetos na coleção, além de também permitirem a verificação do tamanho do conjunto (isto é quantos elementos ele contém), dentre outros.

 

Duas Classes implementam Set diretamente, são elas :

HashSet e TreeSet

 

HashSet –  Através de um mecanismo interno reduz o elemento a um número, e com base nele, realiza uma pesquisa em um sublista de elementos contendo esse mesmo número, é mais rápido que o TreeSet para as operações de modificação do conjunto e não estabelece nenhuma ordem particular entre os objetos.

 

cvqucp4fig01.jpg 

 

TreeSet – Preserva a ordem natural dos elementos, porem ocorre uma perda de performance na inserção e deleção TreeSet utiliza-se de uma árvore Binária para alinhar os elementos. Esse tipo de abordagem se mostra bastante eficiente para procurar elementos, esta abordagem consta em se varrer uma árvore balanceada, contudo se ponto fraco reside justamente no balanceamento da árvore, que pode gerar lentidão a depender da quantidade de elementos existentes.

 

cvqucp4fig02.jpg 

 

Exemplo do uso de HashSet()

 

package colecoes;

//Exemplo01 HashSet

import java.util.HashSet;

 

public class ExemploSet {

            public static void main(String[] args) {

                        // TODO Auto-generated method stub

                        HashSet<String> set  = new HashSet<String>();

                        set.add("Dinardo");

                        set.add("Rosa");

                        set.add("Dinardo");

                        set.add("Rafael");

                        set.add("Luís");

                        set.add("Rafael");

                        set.add("Jobson");

                        set.add("Anderson");

                        set.add("Rosa");

                        System.out.println(set);

            }

}

 

O Resultado desse código é mostrado a seguir:

 

[Jobson, Rafael, Rosa, Anderson, Luis, Dinardo]

 

Observe que embora houvessem elementos duplicados, quando imprimimos o objeto set, não foi mostrado nem dos elementos duplicados.

 

package colecoes;

 

//Exemplo01 HashSet e TreeSet

import java.util.HashSet;

import java.util.Set;

import java.util.TreeSet;

 

public class Ordenado {

            public static void main(String[] args) {

                        // TODO Auto-generated method stub

                        HashSet<String> set = new HashSet<String>();

                        set.add("Dinardo");

                        set.add("Rosa");

                        set.add("Dinardo");

                        set.add("Rafael");

                        set.add("Luís");

                        set.add("Rafael");

                        set.add("Jobson");

                        set.add("Anderson");

                        set.add("Rosa");

                        Set setOrdenado = new TreeSet(set);

                        System.out.println(setOrdenado);

            }

}

 

Resultado do código mostrado acíma:

 

[Anderson, Dinardo, Jobson, Luis, Rafael, Rosa]

 

Agora vamos a mais um exemplo, sendo este um exemplo um pouco mais útil que os anteriores.

 

ListaPalavras.java

 

// codigo baseado nas Classes ListaDePalavras.java e DemoListaPalavras.java

//ambos fazem parte do livro Introdução a orientação a objeto com Java

// de Rafael Santos

 

package colecoes;

 

import java.util.*;

 

public class ListaPalavras {

 

            private Set lista;

           

            public ListaPalavras() {

            lista = new TreeSet();

            }

           

            public void adiciona(String listaPalavras)

            {

                        StringTokenizer listaTokens = new StringTokenizer(listaPalavras);

                        while (listaTokens.hasMoreElements()) {

                                   lista.add(listaTokens.nextToken());

                                   }

                       

            }

           

            public boolean existe(String palavra){

                        return lista.contains(palavra);

            }

}

 

ExecutaListaPalavras.java

 

// codigo baseado nas Classes ListaDePalavras.java e DemoListaPalavras.java

//ambos fazem parte do livro Introdução a orientação a objeto com Java

// de Rafael Santos

 

package colecoes;

 

public class ExecutaListaPalavras {

 

           

            public static void main(String[] args) {

            ListaPalavras frases  = new ListaPalavras();

            frases.adiciona("Ontem eu acordei com dor de cabeça");

            frases.adiciona("Quem foi que disse que esta certo");

            frases.adiciona("Certo ou errado o que me importa");

            frases.adiciona("Eu quero ir pra casa, estou cansado");

            System.out.print(frases.existe("eu")); // O resultado será true

            System.out.print(frases.existe("certo")); // O resultado será true

            System.out.print(frases.existe("nós")); // O resultado será false

            }

 

}

 

A Classe ListaPalavras faz o encapsulamento de uma lista de palavras sem repetição,o método adiciona recebe uma string e adiciona a lista, o método existe retorna os valores boleanos, true ou false caso a palavra passada exista ou não.

 

Em nosso próximo artigo falaremos sobre MAP.

 

Até mais.