Collections Marco Antonio, Arquiteto de Software – TJDF [email protected] Atualizado Dezembro/2008 Coleções Mecanismo que permite o armazenamento de vários objetos. É uma solução flexível e simples. Principais métodos: add(), remove(). put(), get(). Não aceitam tipos primitivos (int, short, long, etc). Tipos Listas e conjuntos. Iterators. Mapas. Propriedades. Consequências Eficiência no acesso, na busca ou na inserção. Forma de organização de dados. Características Oferece uma biblioteca de classes e interfaces (pacote java.util). Implementa as principais estruturas de dados de forma reutilizável, usando apenas duas interfaces comuns. Oferece implementações de cursor para iteração para extrair dados de qualquer estrutura usando uma única interface. As interfaces Implementações Várias possibilidades Como você pôde ver, existem várias classes/interfaces com características específicas para cada necessidade. Vamos ver as soluções mais comuns. O mundo das coleções é muito extenso e não será totalmente coberto nesta apresentação. Mesmo assim, a grande maioria das necessidades dos sistema é atendida com folga pelos exemplos aqui mostrados. Collection Vamos dar uma olhada na interface java.util.Collection. No exemplo utilizaremos a implementação ArrayList. Iterator Para navegar pelos objetos de uma coleção devemos utilizar o Iterator. Uma coleção pode ter vários Iterators. Os principais métodos: hasNext() - verifica se existem mais elementos. next() - recupera o próximo elemento. remove() - remove um elemento. ObjetoQualquer package com.javabasico.collection; public class ObjetoQualquer { private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } Exemplo completo package com.javabasico.collection; import java.util.*; public class ExemploDeCollection { public static void main(String[] args) { /* * Essa é a sintaxe para criar uma coleção simples. */ Collection colecao = new ArrayList(); /* * Agora, vamos criar alguns objetos e fazer as atribuições. * */ ObjetoQualquer objeto1 = new ObjetoQualquer(); objeto1.setNome("Primeiro nome"); ObjetoQualquer objeto2 = new ObjetoQualquer(); objeto2.setNome("Segundo nome"); ObjetoQualquer objeto3 = new ObjetoQualquer(); objeto3.setNome("Terceiro nome"); Exemplo completo /* * O último passo é adicionar cada um dos objetos em nossa coleção. */ colecao.add(objeto1); colecao.add(objeto2); colecao.add(objeto3); /* * Para recuperar os objetos de uma coleção devemos utilizar um Iterator. * Veja o exemplo de sintaxe. * Observação: só existe a possibilidade de navegação para frente. */ Iterator iteColecao = colecao.iterator(); while (iteColecao.hasNext()) { //Conversão obrigatória. Atenção a esse detalhe!!! ObjetoQualquer objetoRecuperado = (ObjetoQualquer) iteColecao.next(); //Pronto, agora você pode utilizar o objeto que foi recuperado da maneira que quiser. System.out.println("Objeto recuperado: " + objetoRecuperado.getNome()); } } } Pessoa package com.javabasico.collection; public class Pessoa { private String nome; private String endereco; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } } FabricaDePessoas package com.javabasico.collection; import java.util.*; public class FabricaDePessoas { public Collection getListaDePessoa() { Pessoa jose = new Pessoa(); jose.setNome("Jose"); jose.setEndereco("Algum Lugar"); Pessoa carlos = new Pessoa(); carlos.setNome("Carlos"); carlos.setEndereco("Outro Lugar"); Pessoa diego = new Pessoa(); diego.setNome("Diego"); diego.setEndereco("Sua Casa"); Collection lista = new ArrayList(); lista.add(diego); lista.add(jose); lista.add(carlos); return lista; } } ImprimeListaDePessoas package com.javabasico.collection; import java.util.*; public class ImprimeListaDePessoas { public static void main(String[] args) { 1. FabricaDePessoas fabrica = new FabricaDePessoas(); 2. Collection listaDePessoas = fabrica.getListaDePessoa(); 3. Iterator iteListaDePessoas = listaDePessoas.iterator(); 4. while (iteListaDePessoas.hasNext()) { 5. Pessoa pessoaRecuperada = (Pessoa) iteListaDePessoas.next(); 6. System.out.println(pessoaRecuperada.getNome()); 7. System.out.println(pessoaRecuperada.getEndereco()); } } } ImprimeListaDePessoas 1. Cria a nossa fábrica de objetos. 2. Recupera a lista de pessoas da fábrica. 3. Recupera o iterator para ler os objetos da coleção. 4. Loop – iteração 5. Recupera a próxima pessoa. 6. Imprime o nome da pessoa. 7. Imprime o endereço da pessoa. Set Agora vamos ver um exemplo de java.util.Set. A implementação será HashSet. Set não permite valores repetidos. ExemploDeSet package com.javabasico.collection; import java.util.*; public class ExemploDeSet { public static void main(String[] args) { Set conjunto = new HashSet(); conjunto.add("um"); conjunto.add("dois"); conjunto.add("três"); conjunto.add("um"); conjunto.add("um"); Iterator iteConjunto = conjunto.iterator(); while (iteConjunto.hasNext()) { System.out.println(iteConjunto.next()); } } } sort package com.javabasico.collection; import java.util.*; public class TesteOrdenacao { public static void main(String[] args) { List listaDesordenada = new ArrayList(); listaDesordenada.add("Jose"); listaDesordenada.add("Maria"); listaDesordenada.add("Joao"); listaDesordenada.add("Airton"); listaDesordenada.add("Zulima"); // Imprima a lista desordenada Collections.sort(listaDesordenada); // Imprima a lista ordenada } } Map O Map tem uma combinação de chaves/valores. Funciona da seguinte maneira: uma chave está associada a um valor. As chaves, claro, são únicas. Os valores podem ser duplicados. Principais métodos put(Object key, Object value) – acrescenta um objeto na lista, associando-o a uma chave. get(Object key) - retorna um objeto através de sua chave. keySet() - retorna um Set com as chaves values() - retorna uma Collection com os valores. ExemploDeMap package com.javaavancado.collection; import java.util.*; public class ExemploDeMap { public static void main(String[] args) { Map mapa = new HashMap(); mapa.put("um", "Primeiro valor"); mapa.put("dois", "Segundo valor"); mapa.put("tres", "Terceiro valor"); System.out.println("Valor recuperado: " + mapa.get("dois")); Set chaves = mapa.keySet(); Collection valores = mapa.values(); System.out.println(chaves); System.out.println(valores); } } Properties Mecanismo utilizado principalmente para recuperar informações do sistema. ExemploDeProperties package com.javabasico.collection; import java.util.*; public class ExemploDeProperties { public static void main(String[] args) { Properties p = System.getProperties(); System.out.println("Todas as propriedades do sistema operacional:"); System.out.println(p); System.out.println("Imprimindo propriedades isoladas:"); System.out.println("Nome do SO: " + p.get("os.name")); System.out.println("Nome do Runtime: " + p.get("java.runtime.name")); System.out.println("País do usuário: " + p.get("user.country")); // Imprima a versão do java, o diretório do usuário, o nome do usuário. } } Dúvidas?