Utilizando Collections – Parte II

 

Listas

O cliente ficou tão satisfeito com os resultados obtidos pelo sistema que resolveu

pedir mais um.

 

Ele agora quer uma simples listagem de quais pessoas passaram pela sua loja no dia. E fez as seguintes observações: Algumas pessoas que entram são pessoas da minha família que quero poder excluir da listagem e outras pessoas entram mais de uma vez, e quero também presentear sempre a segunda pessoa que entrar no estabelecimento.

 

Ok! Então vamos lá. Segue a nossa implementação para o sistema:

 

ExampleList.Java

 

import java.util.*;

import static java.lang.System.out;

public class ExampleList1 {

public static void printList(List obj) {

for (String e : obj) {

out.print(e + " ");

}

out.println();

}

 

public static void execute() {

List list = new ArrayList();

list.add("PersonB");

list.add("PersonA");

list.add("PersonC");

list.add("PersonFamily");

list.add("PersonC");

printList(list);

list.remove("PersonFamily");

out.println("PersonFamily removed");

out.println(list.get(1) + ", you are the winner!!");

printList(list);

}

 

public static void main(String[] args) {

ExampleList.execute();

}

}

 

Que imprime:

 

PersonB PersonA PersonC PersonFamily PersonC

PersonFamily removed

PersonA, you are the winner!!

PersonB PersonA PersonC PersonC

 

Em aproximadamente 90% dos casos que envolvam listagens, utilizaremos

ArrayList para resolver os nossos problemas. O método remove exclui a primeira

ocorrência do elemento passado como parâmetro, caso ele exista. Podemos acessar cada elemento da lista pela posição com o método get, lembrando que o primeiro elemento tem o índice 0.

 

Nosso cliente está muito entusiasmado com o negócio e está querendo que todas as pessoas formem uma fila para entrarem em sua loja. “O primeiro a entrar, tem que ser o primeiro a sair”, ele disse.

 

Olha a nossa implementação:

 

ExampleList2.Java

 

import java.util.*;

import static java.lang.System.out;

public class ExampleList2 {

public static void printQueue(Queue obj) {

for (String e : obj) {

out.println(e + " is in.");

}

out.println();

}

 

public static void execute() {

Queue list = new LinkedList();

list.add("PersonA");

list.add("PersonB");

list.add("PersonC");

list.add("PersonD");

list.add("PersonE");

printQueue(list);

while(!list.isEmpty()) {

out.println(list.element() + " is out.");

list.remove();

}

}

 

public static void main(String[] args) {

ExampleList2.execute();

}

}

 

Resultado da impressão:

 

PersonA is in.

PersonB is in.

PersonC is in.

PersonD is in.

PersonE is in.

PersonA is out.

PersonB is out.

PersonC is out.

PersonD is out.

PersonE is out.

 

Isso aí! Está funcionando perfeitamente!! Mais uma vez nosso cliente ficou feliz. E

se o primeiro a entrar fosse o último a sair (LIFO)!? Fica como exercício para vocês. ;)

 

Vamos agora para o nosso último objeto de estudo deste artigo.

 

Chave-Valor

Nosso cliente está ficando rico com o nosso sistema! Ele agora quer contratar

funcionários. Cada funcionário terá uma matrícula (chave) associada a seu nome (valor) e, além disso, nosso cliente quer saber quem é o funcionário que possui a matricula de número 3 (deve ser para receber um aumento :) ).

 

Então, mãos a obra:

 

ExampleMap.Java

 

import java.util.*;

import static java.lang.System.out;

public class ExampleMap {

public static void printMap(Map obj) {

for (Map.Entry e : obj.entrySet()) {

out.println(e.getKey() + " : " + e.getValue());

}

out.println();

}

 

public static void execute() {

Map map = new HashMap();

map.put(1,"Employee-A");

map.put(3,"Employee -C");

map.put(2,"Employee -B");

map.put(4,"Employee -D");

printMap(map);

}

 

public static void main(String[] args) {

ExampleMap.execute();

}

}

 

Resultado da impressão:

 

2 : Employee -B

4 : Employee -D

1 : Employee -A

3 : Employee -C

Name of the looked employee: Employee-C

 

Pessoal, o nosso cliente não ficou muito feliz. Ele quer que os funcionários apareçam na ordem em que foram inseridos. Vamos aproveitar a nossa experiência adquirida com conjuntos. Basta alterar:

 

Map map = new HashMap();

 

Para:

 

Map map = new LinkedHashMap();

 

A saída agora será:

 

1 : Employee-A

3 : Employee-C

2 : Employee-B

4 : Employee-D

Name of the looked employee: Employee-C

 

E como somos pró-ativos, vamos fazer um relatório ordenado pela matrícula do

funcionário. Substituiremos isto:

 

Map map = new LinkedHashMap();

 

Por isso:

 

Map map = new TreeMap();

 

Agora sim! Resultado da nossa impressão:

 

1 : Employee-A

2 : Employee-B

3 : Employee-C

4 : Employee-D

Name of the looked employee: Employee-C

 

Conclusões

Vimos uma pequena parte dos vastos recursos que o Java Collections Framework

proporciona a nós, desenvolvedores. Lembrando que as coleções utilizadas dessa forma não são thread-safe, ou seja, teremos problemas se várias threads estiverem alterando nossas coleções. Para casos onde a concorrência é uma realidade, a classe Collections (não confundir com a interface Collection) possui um método estático (synchronized<YOUR COLLECTION>) para cada tipo de coleção, que fará com que seu objeto seja thread-safe.

 

Dêem uma estudada nos métodos da classe Collections e Arrays. Vários deles nos ajudam bastante no dia-a-dia.

 

É pessoal, espero que tenham gostado. Pesquisem a documentação de cada classe e interface que estudamos, e, quaisquer dúvidas, entrem em contato. Será um imenso prazer caminhar com vocês nessa longa estrada do conhecimento.

 

Um abraço e até a próxima!!

 

Leia a parte i.

Referências