Sunteți pe pagina 1din 8

Java Collections: Set, List e Iterator

Veja neste artigo como trabalhar com colees e utilizar os recursos de


Set, List e Iterator com Java, focando nas boas prticas para utilizao
de tais recursos.
Neste artigo trabalharemos com alguns recursos disponveis na
linguagem Java, muito teis e indispensveis no dia a dia do profissional,
so eles: List, ArrayList, Set, HashSet, Iterator e um pouco de Generics.
No decorrer do artigo voc ver que ambos os recursos tem suas
correlaes, ou seja, os assuntos abordados esto ligados mesmo que
indiretamente. Explicaremos o uso de cada um destes.
Antes de iniciar as explicaes de cada um importante realizar uma
pequena comparao entre os seguintes recursos: List e Set. Ambos
armazenam uma lista. A diferena principal que o 'Set' no aceita
elementos duplicados, diferente do List.
List e ArrayList
O List uma interface e o ArrayList a classe que a implementa. Veja
um exemplo na Listagem 1.
Listagem 1. Criando um ArrayList a partir do List
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class DevmediaList {

/**
* @param args
*/
public static void main(String[] args) {

/*
* Declaremos nosso objeto sem nenhuma instncia
*
* */
List carros;

/*
* Criamos uma instncia qualquer para o nosso objeto
* do tipo List, sendo que essa instncia deve
* obrigatoriamente implementar a interface List.
* Veja as possibilidades
* */
carros = new ArrayList();
carros = new LinkedList();

//e assim por diante...


}

}
Ento voc pode questionar: Porque no fazer um ArrayList carros =
new ArrayList(); sem usar as interfaces ? Por uma questo muito simples:
voc precisa garantir a flexibilidade da sua aplicao, garantir que o
mesmo objeto possa ser instanciado de maneiras distintas em pontos
distintos da aplicao. Como voc tem uma interface List, voc tem
certeza dos mtodos que seu objeto tem, mesmo que ele seja
instanciado por uma classe como ArrayList ou LinkedList. Vamos
melhorar um pouco mais nossa Listagem 1, adicionando o uso de
Generics (Listagem 2).
Listagem 2. Usando Generics com ArrayList e List
import java.util.ArrayList;
import java.util.List;

public class DevmediaList {

/**
* @param args
*/
public static void main(String[] args) {

/*
* Agora adicionamos um Generic "<Carro>", assim s podemos
* adicionar objetos do tipo 'Carro' nossa lista.
*
* */
List<Carro> carros;

/*
* Criamos uma ArrayList apenas com carros
* */
carros = new ArrayList<Carro>();

/*
* Voc conseguir criar sem problemas um ArrayList
* sem passar o tipo Generic, mas a IDE ir dar um
* Warning dizendo que voc deveria passar um
* tipo Generic, para evitar erros em runtime.
* */
carros = new ArrayList();

/*
* O cdigo abaixo no ser compilado, erro em tempo de
* design. Pois nosso objeto 'carros' agora muito
* exigente: S aceita implementaes de List que tenham
* objetos do tipo 'Carro'. Estamos tentando fazer
* um 'cast' de Animal para Carro e
* isso no possvel.
* */
carros = new ArrayList<Animal>();

}
Para finalizar o uso do List, vamos mostrar alguns mtodos muito
utilizados no dia a dia. Observe aListagem 3.
Listagem 3. Uso de mtodos frequentes com List
import java.util.ArrayList;
import java.util.List;

public class DevmediaList {

/**
* @param args
*/
public static void main(String[] args) {

List<Carro> carros = new ArrayList<Carro>();


List<Carro> carrosNovos = new ArrayList<Carro>();

Carro carro = new Carro();

//adiciona um carro a nossa lista


carros.add(carro);

//adiciona um carro a uma posio exata da lista


carros.add(10, carro);

/*
* Imagine que desejamos adicionar uma lista de
* carros novos a nossa lista de carros,
* podemos adicionar todos de uma s vez, usando o 'addAll'
* */
carros.addAll(carrosNovos);

/* Caso prefira, pode usar um for para adicionar


* os carrosNovos.Nosso lao FOR abaixo, tem a mesma
* funo do addAll.
*/
for(int i = 0 ; i < carrosNovos.size(); i++){
carros.add(carrosNovos.get(i));
}

/*
* Verifica se o carro est na lista de carros.
* Mas como essa verificao feita ?
* Atravs do mtodo 'equals' do seu objeto carro.
* Sendo assim, na implementao do
* seu bean 'Carro', muito importante que voc
* sobreescreva o mtodo 'equals' dizendo
* como as comparaes devem ser realizadas.
* */
carros.contains(carro);

//Remove todos os elementos da lista


carros.clear();

}
Esses mtodos mencionados acima so os usados com muita
frequncia, mas nada impede que voc faa um estudo em cada
mtodo.
Set e HashSet
Assim como o List uma interface e o ArrayList sua implementao, o
Set e HashSet seguem a mesma analogia, onde o Set a interface e o
HashSet sua implementao. Observe a Listagem 4.
Listagem 4. Usando Set
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class DevmediaSet {

/**
* @param args
*/
public static void main(String[] args) {

Set<Carro> carros;

//Voc pode implementar com HashSet


carros = new HashSet<Carro>();
//Pode tambm optar pelo LinkedHashSet
carros = new LinkedHashSet<Carro>();

//e assim por diante

}
Voc j deve ter percebido que podemos implementar diferentes
instncias para uma mesma interface Set, obviamente que cada uma
tem sua peculiaridade e no foco deste artigo mostrar as
peculiaridades de cada implementao.
Uma diferena muito comum entre o Set e o List o retorno de
determinados elementos em uma posio exata da lista, pois com o List
podemos simplesmente fazer um 'get(index)' e voc ter o elemento X
na posio INDEX. Na Listagem 5 iremos demonstrar como percorrer
todos s elementos usando o iterator.
Listagem 5. Usando iterator para capturar elementos no Set
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class DevmediaSet {

/**
* @param args
*/
public static void main(String[] args) {

Set<Carro> carros;

//Voc pode implementar com HashSet


carros = new HashSet<Carro>();

/*
* Percorrer todo SET com iterator
* */
Iterator<Carro> carrosAsIterator = carros.iterator();
while (carrosAsIterator.hasNext()){
Carro it = carrosAsIterator.next();

}
}

}
No exemplo acima, abstraamos a maioria dos comentrios que j
fizemos nas listagens anteriores, assim tornamos o mesmo sucinto e
prtico. Veja na Listagem 6 um exemplo mais completo de como
trabalhar com Iterator.
Listagem 6. Trabalhando com Iterator
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class DevmediaSet2 {

public static void main(String args[]) {

ArrayList al = new ArrayList();

al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");

// Usamos o iterator para mostrar o contedo do ArrayList


System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();

// Modify objects being iterated


ListIterator litr = al.listIterator();
while(litr.hasNext()) {
Object element = litr.next();
litr.set(element + "+");
}
System.out.print("Modified contents of al: ");
itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
System.out.print("Modified list backwards: ");
while(litr.hasPrevious()) {
Object element = litr.previous();
System.out.print(element + " ");
}
System.out.println();
}
}
Os exemplos mostrados acima so prticos o suficiente para que voc
leitor possa questionar o uso de tais recursos em seu dia a dia. Algumas
vezes utilizados de forma errada. comum, por exemplo, em projetos
iniciantes notarmos a falta de interfaces e implementaes corretas de
polimorfismo, por exemplo. Este artigo tem como principal objeto no s
mostrar o uso dos recursos, j conhecidos por muitos, mas tambm
mostrar a forma correta e ideal de utiliz-los. Ento, caso voc esteja
utilizando outra forma que seja distinta da mostrada nas sees
anteriores, aconselhamos que a mesma seja analisada.
Dizemos 'analisada', pois toda nova soluo ou alterao deve ser
analisada antes de alterada, e no simplesmente trocada sem uma
anlise crtica.
Para finalizar veja na Listagem 7 uma forma alternativa de utilizar o
iterator com um 'foreach'.
Listagem 7. Usando iterator com foreach
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class DevmediaSet {

/**
* @param args
*/
public static void main(String[] args) {

Set<Carro> carros;

//Voc pode implementar com HashSet


carros = new HashSet<Carro>();

/*
* Percorrer todo SET com iterator usnado foreach
* */
for(Iterator<Carro> iter = carros.iterator();
iter.hasNext();) {
Carro carroAtual = iter.next();
}

}
A forma demonstrada acima uma alternativa ao while(it.hasNext())
que utilizamos nas listagens acima.
Com isso, o artigo aqui apresentado teve foco em maior parte do
tempo na prtica voltada aos recursos que estudados, deixando um
pouco a teoria de lado. Mas vale ressaltar que estudar os recursos (suas
classes, sendo mais especfico) muito importante para entender o
funcionamento como um todo, e no se ater somente ao descrito neste
artigo.

S-ar putea să vă placă și