Desenvolvimento e Projeto de Aplicações Web [email protected] Conteúdo • Coleções 1 Introdução • Desde a versão 1.2 do JDK, a plataforma J2SE inclui um framework de coleções (Collections) • Uma coleção é um objeto que representa um grupo de objetos • Um framework de coleções é uma arquitetura unificada para representação e manipulação de coleções, permitindo que elas sejam manipuladas independentemente dos detalhes de sua implementação Coleções: Tipos Estruturados • Uma coleção é um tipo de dado estruturado usado para agrupar, em uma única unidade, vários elementos homogêneos ou heterogêneos • Cada coleção é um objeto usado para armazenar, recuperar e fazer operações sobre dados • Java Collections Framework: Conjunto de interfaces, implementações e algoritmos 2 Vantagens • Redução do esforço de programação – Estruturas de dados e algoritmos úteis, para diminuir reescrita • Aumento da performance – implementações de alta performance – Como as várias implementações de cada interface são substituíveis, os programas podem ser facilmente refinados trocando-se as implementações Vantagens • Interoperabilidade entre APIs não relacionadas – Estabelecendo uma linguagem comum para passagem de coleções • Redução do esforço de aprendizado de APIs – Eliminando a necessidade de se aprender várias APIs de coleções diferentes. 3 Vantagens • Redução do esforço de projetar e implementar APIs, – Eliminando a necessidade de se criar APIs de coleções próprias • Promover o reuso de software, – Fornecendo uma interface padrão para coleções e algoritmos para manipulá-los. Java Collections Framework • A biblioteca de coleções é composta por: – Interfaces: tipos abstratos que representam coleções e unificam as sua operações. – Implementações: implementações das interfaces, usadas para criar objetos 4 Coleções (Java Collections Framework) • A biblioteca de coleções (collecions) é composta por: – Algoritmos: atuam sobre objetos que implementam as interfaces e oferecem serviços como pesquisa e ordenação • Pacote: – java.util.*; Collection • Interface base para todos os tipos de coleção. • Define as operações básicas para coleções de objetos, – adição (add) e remoção (remove), esvaziamento (clear), tamanho (size), conversão para array (toArray), objeto de iteração (iterator), e verificações de existência (contains e isEmpty) 5 Coleções Básicas • Base: interface java.util.Collection e Map • Interfaces de tipos fundamentais – List: coleção ordenada que pode conter elementos duplicados. Implementada pela classe Vector – Map: mapeamento chave-valor, sendo cada chave única. Especialização: SortedMap – Set: coleção sem elementos duplicados. Especialização: SortedSet Coleções Básicas • Cada interface é implementada com diferentes estruturas de dados. Ex: HashSet, TreeSet class Vector: implementa um array dinâmico 6 Coleções Básicas Hierarquia de Coleções em Java • Hierarquias distintas: Collection e Map • Collection: todos os métodos que são comuns às coleções gerais • Map: todos os métodos que são comuns a coleções de pares de elementos 7 Collection: Operações Básicas • A interface Collection contém os métodos abstratos para as operações fundamentais public interface Collection { // Operações básicas int size(); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); // Optional boolean remove(Object element); // Optional Iterator iterator(); // ... Importante: Cada coleção implementa suas operações Exemplo de Vector import java.util.*; public class TestaVector{ public static void main(String args[]){ Vector vetor = new Vector(); vetor.add(new Integer(100)); Casting: Object x Integer vetor.add(new Integer(200)); e vetor.add(new Integer(300)); conversão: Integer x int int soma=0; int elem; for(int i=0; i<vetor.size();i++){ elem=((Integer)vetor.elementAt(i)).intValue( ); soma+=elem; } System.out.println("Soma: " + soma); }} 8 Vector com classe do usuário public class Professor { public String nome; public Ramal ramal; public Professor(String n, int r){ nome = n; ramal = new Ramal(r); } public String toString(){ return "Nome: "+ nome + ", Ramal: " + ramal.numero; }} Considerando a classe Professor Vector com classe do usuário: teste import java.util.*; public class VectorProfessor{ Um Vector public static void main(String args[]){ Vector <Professor> professores = Professor new Vector(); professores.add(new Professor("Manuela", 3344)); professores.add(new Professor("Carlos", 1549)); professores.add(new Professor("Roberto", 6678); System.out.println(professores); Exibe os [Nome: Manuela, Ramal: 3344, } Nome: Carlos, Ramal: 1549, elementos } Nome: Roberto, Ramal: 6678] 9 Array x Vector • Array – Limitações de tamanho – Exemplo: private Conta[] contas; private final static int tamCache = 100; contas = new Conta[tamCache]; Array 10 Problemas com Array • Precisamos saber o tamanho do array antes de utilizar • Operações de inclusão, alteração e exclusão são limitadas • Tamanho do array é fixo, o que normalmente não ocorre em uma coleção Usando Vector • O Vector tem tamanho variável • Possui operações de inclusão, alteração e exclusão • A iteração, localização etc.. é mais simples • Para usar o método sort da classe Array, basta transformar para um array através do método.toArray() 11 Exemplo com Vector Interface Map: Operações Básicas chave chave chave valor valor valor public interface Map { Object put(Object key, Object value); Object get(Object key); Object remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); ... } 12 Exemplo HashMap: chave: String disciplina valor: Professor Vector<Professor> professores = new Vector(); professores.add(new Professor("Manuela", 3344)); professores.add(new Professor("Carlos", 1549)); professores.add(new Professor("Roberto", 6678)); System.out.println(professores); String[] disciplinas= {"matemática", “física","português"}; HashMap vincula=new HashMap(); int p=0; for(String s:disciplinas){ vincula.put(s, professores.elementAt(p++)); } System.out.println(vincula); {português=Roberto, Ramal: 6678, física=Carlos, Ramal: 1549, ...} Outras Operações • A interface Collection também contém os métodos abstratos para operações sobre o agrupamento // operações com coleções boolean containsAll(Collection c); boolean addAll(Collection c); // boolean removeAll(Collection c); // boolean retainAll(Collection c); // void clear(); // Optional Optional Optional Optional // operações com arrays Object[] toArray(); Object[] toArray(Object a[]); 13 Interfaces Auxiliares • Iterator • Navegação nos elementos da coleção Conta c; Collection contas = controladorContas.getContas(); Iterator it = contas.iterator(); while (it.hasNext()) { c = (Conta) it.next(); System.out.println(“Numero = “ + c.getNumero() + “ Saldo = “ + c.getSaldo()); } Interfaces Auxiliares • ListIterator • Interface que estende Iterator, adicionando funções específicas para coleções do tipo List • É obtida através do método listIterator() de uma List • Operações de navegação em ambos os sentidos 14 Interfaces Auxiliares • Uma coleção ordenada deve possuir alguma forma de comparação entre os elementos para se determinar a sua ordem • Implementar Comparable • Comparação do próprio objeto com outro Comparable • Definir a ordem natural dos elementos de uma coleção • Método compareTo(Object obj) – Compara a ordem do objeto atual com obj – Retorna um inteiro negativo, zero ou um inteiro positivo se o objeto atual é menor, igual ou maior do que obj 15 Comparable • Para alguns tipos de objetos – Integer, Double ou String – existe uma ordem “natural” • Ao adicionar um elemento em uma coleção ordenada que está utilizando ordenação natural, o elemento deve ser uma instância de uma classe que implementa a interface Comparable Interfaces Auxiliares • Comparator • Comparação entre dois objetos por um objeto externo. • É utilizado quando os objetos a serem adicionados não podem ser modificados para aceitarem a interface Comparable – Exemplo: biblioteca de terceiros ou é necessária a troca da estratégia de ordenação em tempo de execução como em ordenação das linhas de uma tabela, por exemplo 16 Comparator public static class CaseInsensitiveComparator implements Comparator { public int compare(Object e1, Object e2) { String l1 = e1.toString().toLowerCase(); String l2 = e2.toString().toLowerCase(); return l1.compareTo(l2); } } Interfaces Auxiliares • Enumeration • “Ancestral” da interface Iterator, com as mesmas funções, exceto a deleção de elementos • Métodos hasMoreElements() e nextElement() contra hasNext() e next() de Iterator – Dificuldades no código • Utilizada basicamente apenas nas classes Vector e Hashtable 17 Exercício 1. Implemente as classes do projeto projetoAeroporto para gerar e imprimir uma lista de 10 passageiros em ordem alfabética. Utilizar os conceitos do framework collection 2. Refaça o exercício anterior para que a lista de passageiros não permita repetições Arrays • Arrays são ideais para organizar um número fixo de elementos de um mesmo tipo: – String[] diasDaSemana = {“Seg”,"Ter",“Qua",“Qui",”Sex ",“Sab", “Dom"}; • Normalmente, é difícil prever quantos elementos uma coleção pode ter – “Engessamento” 18 Arrays • Um Array apesar de ser uma coleção, possui limitação de tamanho fixo • Todas as demais coleções do framework Java não possuem limitação de tamanho previamente determinado – A coleção vai gerenciando seu tamanho à medida em que os itens são adicionados/removidos ArrayList 19 Genéricos • Antes da versão 5.0 da linguagem Java, toda coleção era criada para objetos do tipo genérico Object • Complicações na recuperação de objetos na coleção • ArrayList<Aluno> alunos = new ArrayList<Aluno>(); • ArrayList<Professor> fac = new ArrayList<Professor>(); • ArrayList<String> nomes = new ArrayList<String>(); ArrayList Métodos • boolean add(Tipo elemento): – Adiciona o elemento ao fim da lista – Tipo faz referência ao tipo especificado no <...> na criação do ArrayList • void add(int n, Tipo elemento): – Insere o elemento na n-ésima posição na lista, deslocando os elementos subsequentes 20 ArrayList Métodos • void add(int n, Tipo elemento): ArrayList Métodos • boolean addAll(Collection c): – Insere todos os elementos da coleção c no final da lista • void clear(): – Remove todos os elementos da lista 21 ArrayList Métodos • boolean contains(Object o1): – Retorna true, caso o objeto o1 esteja presente na lista, e retorna false, em caso contrário • int size(): – Retorna o número de elementos da lista. Caso a lista esteja vazia, esse valor é 0 • boolean isEmpty(): – Retorna true se a lista está vazia e false em caso contrário ArrayList Métodos • boolean remove(Object o1): – Localiza e remove da lista uma instância do objeto o1, retornando true caso o objeto tenha sido removido e false em caso contrário 22 ArrayList Iteração • Loop de iteração da versão 5.0: for (Tipo variavelReferencia: nomeColecao) { // manipula a variavelReferencia // com as ocorrências da coleção } ArrayList Cópia em Array 23 HashMap • HashMap é uma coleção do tipo dicionário onde cada objeto pode ser acessado por um valor de chave único • Cada objeto na coleção e sua chave podem ser de qualquer tipo HashMap 24 HashMap Exemplo HashMap Exemplo (Continuação) 25 HashMap Exemplo (Continuação) Projeto • Refazer o projeto para, no lugar de Arrays de objetos, usar coleções do tipo ArrayList ou HashMap 26 Referências • Deitel, capítulo 19 27