Paradigmas da Programação PPROG Tipos de Dados Enumerados Genéricos Coleções Nelson Freire (ISEP–DEI-PPROG 2012/13) 1/64 PPROG Sumário Geral Tipos Enumerados Tipos Genéricos Tipos Coleção Nelson Freire (ISEP–DEI-PPROG 2012/13) 2/64 PPROG Sumário Geral Tipos Enumerados Tipos Genéricos Tipos Coleção Nelson Freire (ISEP–DEI-PPROG 2012/13) 3/64 Tipos Enumerados Sumário Interesse Definição Implementação Declaração Valor de um Tipo Enumerado Variável de Tipo Enumerado Métodos Automáticos name toString values compareTo equals valueOf Ordinal Métodos Programados Nelson Freire (ISEP–DEI-PPROG 2012/13) 4/64 Tipos Enumerados Interesse Representação Computacional Conjuntos fixos de constantes Constantes Enumeradas // relevante ordem das constantes Constantes Não-Enumeradas // irrelevante ordem das constantes Exemplos Típicos Constantes Enumeradas Dias da semana: { Segunda, Terça, Quarta, Quinta, Sexta, Sábado, Domingo } Meses do ano: { Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro } Tipos de Cartas: { Duque, Terno, Quadra, Quina, Sena, Oito, Nove, Dez, Dama, Valete, Rei, Manilha, As} Notas Escolares: { Mau, Medíocre, Suficiente, Bom, Muito Bom } Constantes Não-Enumeradas Conjunto de cores: { Branco, Preto, Azul } Pontos cardeais: { Norte, Sul, Este, Oeste } Naipes de cartas: { Copas, Espadas, Ouros, Paus } Nelson Freire (ISEP–DEI-PPROG 2012/13) 5/64 Tipos Enumerados Definição de um Tipo Enumerado Tipo Enumerado É um tipo de dados Definido pelo utilizador Valores são constantes ... enumeradas automaticamente desde zero Constante 1 Constante 2 Constante 3 ... Constante N 0 1 2 ... N-1 Valores do tipo Ordem Característica Importante de um Tipo Enumerado Estabelece ordem nos seus valores Valor 1 < Valor 2 < Valor 3 < ... < Valor N Exemplo Interessa aos Conjuntos Dias da Semana = { Segunda, Terça, Quarta, Quinta, Sexta, Sábado, Domingo } Meses = { Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro } Nelson Freire (ISEP–DEI-PPROG 2012/13) 6/64 Tipos Enumerados Implementação de um Tipo Enumerado Pode ser implementado numa classe especial // desde Java5 Chamada enum Não instanciável Possuindo Valores do Tipo // Ex: Métodos Automáticos // adicionados automaticamente pelo compilador name // para obter nome de 1 valor toString // para obter descrição textual de 1 valor values // para obter array contendo todos os valores do tipo enumerado compareTo // para determinar ordem relativa de 2 valores ( v1 <, > ou = v2) equals // para testar igualdade de 2 valores valueOf // para converter nome de valor (string) no valor correspondente ordinal // para obter ordem (posição) de 1 valor Métodos Programados Métodos de Instância Métodos de Classe Variáveis Instância Classe Herda implicitamente a classe Enum public abstract class Enum< E extends Enum<E> > implements Comparable<E>, Serializable { ... } package java.lang Nelson Freire (ISEP–DEI-PPROG 2012/13) 7/64 Tipos Enumerados Declaração : Localização 1/3 Pode ser Classe Independente // Dentro de package Netbeans 1. Clique direito na package 2. New Java Enum Classe Interna // Dentro de classes e interfaces Constantes de Interfaces Por omissão public static final Nelson Freire (ISEP–DEI-PPROG 2012/13) 8/64 Tipos Enumerados Declaração : Classe Independente 2/3 Sintaxe [modificador de acesso] enum nome { constante1, constante2, ..., constanteN } [...] significa opcional Modificador de acesso public package nome Deve ter letra inicial maiúscula constantes Podem ter letras maiúsculas e/ou minúsculas Enumeradas automaticamente desde 0 pelo compilador Exemplos Constantes enumeradas desde 0 AMARELO=0 ; AZUL=1 ; BRANCO=2 ; ENCARNADO=3 Nelson Freire (ISEP–DEI-PPROG 2012/13) 9/64 Tipos Enumerados Declaração : Classe Interna de uma Classe 3/3 Como atributo Sintaxe [modificador de acesso] [static] enum nome { constante1, constante2, ..., constanteN } Modificador de acesso: private, package, protected ou public nome deve ter letra inicial maiúscula constantes podem ter letras maiúsculas e/ou minúsculas Exemplo public class Exemplo { ... public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } // public acesso exterior … } Proibida num método public class Exemplo { … public void metodo() { enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 10/64 Tipos Enumerados Valor de um Tipo Enumerado Referir um valor Caso Geral Sintaxe tipo_enumerado.constante_enumerada // prefixo operador_ponto nome_constante Exemplos Cor.ENCARNADO; // indica valor ENCARNADO do tipo Cor Cor.AMARELO; // indica valor AMARELO do tipo Cor Caso Particular Tipo enumerado declarado como classe interna Indicação no exterior da classe hospedeira Sintaxe public class Exemplo { public static enum Cor { ... } // public acesso exterior … } Classe_hospedeira.tipo_enumerado.constante_enumerada Exemplos Exemplo.Cor.ENCARNADO; // indica valor ENCARNADO do tipo Exemplo.Cor Exemplo.Cor.AMARELO; // indica valor AMARELO do tipo Exemplo.Cor Nelson Freire (ISEP–DEI-PPROG 2012/13) 11/64 Tipos Enumerados Variável de um Tipo Enumerado Declaração Sintaxe tipo_enumerado nome_variável [= valor_do_tipo_enumerado]; Exemplo public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } … public void metodo() { Cor c; ... // inicializada a null, por omissão } } Só pode guardar valores do tipo enumerado declarado Exemplo Variável c só pode armazenar valores do tipo enumerado Cor Cor c = Cor.ENCARNADO; c = Cor.BRANCO; Nelson Freire (ISEP–DEI-PPROG 2012/13) 12/64 Tipos Enumerados Método name Interesse Obter nome de um valor Declaração public String name() { … } // método de instância Retorna Nome do valor sobre o qual é aplicado o método public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } public void metodo() { // método name aplicado a valor String nome = Cor.ENCARNADO.name(); ... // nome = ENCARNADO // método aplicado a variável de tipo enumerado Cor c1 = Cor.BRANCO; // variável c1 do tipo enumerado Cor System.out.println( c1.name() ); // imprime BRANCO } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 13/64 Tipos Enumerados Método toString 1/2 Interesse Obter descrição textual de um valor Declaração public String toString() { … } // método de instância Retorna Por omissão (i.e. se não for redefinido) Semelhante ao método name Retorna nome do valor sobre o qual é aplicado o método public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } public void metodo() { // método toString aplicado a valor String descricao = Cor.ENCARNADO.toString(); ... // descricao = ENCARNADO, por omissão // método aplicado a variável de tipo enumerado Cor c1 = Cor.BRANCO; // variável c1 do tipo enumerado Cor System.out.println( c1.toString() ); // imprime BRANCO } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 14/64 Tipos Enumerados Método toString 2/2 Pode ser redefinido para cada valor Exemplo public class Exemplo { public static enum DiasDaSemana { SABADO { public String toString() { return "Sábado"; } } , // redefinição toString() DOMINGO { public String toString() { return "Domingo"; } }, SEGUNDA { public String toString() { return "Segunda-feira"; } }, TERCA { public String toString() { return "Terça-feira"; } }, QUARTA { public String toString() { return "Quarta-feira"; } }, QUINTA { public String toString() { return "Quinta-feira"; } }, SEXTA { public String toString() { return "Sexta-feira"; } } } public void metodo() { String dia = DiasDaSemana.SEGUNDA.toString(); // dia = "Segunda-feira" } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 15/64 Tipos Enumerados Método values Interesse Obter array contendo todos os valores do tipo enumerado Exemplo: varrimento de todos os valores do tipo enumerado Declaração public static tipoEnumerado[] values() { ... } Método de classe (static) Aplica-se ao tipo enumerado Exemplo: Cor.values() Retorna Array com todos os valores do tipo enumerado sobre o qual é aplicado o método public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } public void metodo() { ... // Imprimir todas as descrições de valores do tipo Cor for( Cor c : Cor.values() ) System.out.println( c ); } // por omissão: c.toString() } Nelson Freire (ISEP–DEI-PPROG 2012/13) 16/64 Tipos Enumerados Método compareTo Interesse Determinar posição relativa de 2 valores do mesmo tipo enumerado Declaração public int compareTo(TipoEnumeradoDoRecetor o){ … } // tipo enum implementa Comparable Retorna Valor Inteiro -1 0 1 // valor1 < valor2 // valor1 = valor2 // valor1 > valor2 // método de instância Exemplo valor1.compareTo( valor2 ) public class Exemplo { public static enum Nota { MAU, MEDIOCRE, SUFICIENTE, BOM, MUITO BOM } public void metodo() { Nota n1 = ... , n2 = ...; // Ex: Nota n1 = Nota.BOM, n2 = Nota.MAU; if ( n1.compareTo(n2) > 0 ) System.out.println( n1.name() + " é melhor do que " + n2.name() ); else if ( n1.compareTo(n2) < 0 ) System.out.println(" n1.name() + " é pior do que " + n2.name() "); else System.out.println(" Notas iguais "); } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 17/64 Tipos Enumerados Método equals Interesse Testar a igualdade de 2 valores Declaração public boolean equals(Object o) // método de instância Retorna Resultado do teste de igualdade entre Object o e valor sobre o qual é aplicado o método true ou false public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } public void metodo() { ArrayList figuras = new ArrayList(); ... // para guardar instâncias de figuras geométricas for( Object obj : figuras){ Figura f = (Figura) obj; if( f.getCor().equals( Cor.ENCARNADO ) ) System.out.println( f ); // Equivalente : f.getCor() == Cor.ENCARNADO // imprime só figuras de cor ENCARNADO } } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 18/64 Tipos Enumerados Método valueOf 1/2 Interesse Converter nome dum valor no valor correspondente Exemplo "BRANCO" Cor.BRANCO Declaração public static tipo_enumerado valueOf(String name) Método de classe (static) Aplicado ao tipo enumerado Exemplo Cor.valueOf ("BRANCO") Retorna Valor com nome passado por parâmetro Exemplo Cor c = Cor.valueOf ("BRANCO"); // c = Cor.BRANCO Caso não exista valor com esse nome Gerado erro de execução Lançada exceção IllegalArgumentException Exemplo Ex: Cor.valueOf ("branco") Nelson Freire (ISEP–DEI-PPROG 2012/13) 19/64 Tipos Enumerados Método valueOf 2/2 Exemplo public class Exemplo { ... public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } … public void metodo() { Scanner ler = new Scanner(System.in); System.out.println("Escreva uma cor (AMARELO, AZUL, BRANCO, ENCARNADO):"); String cor = ler.next().toUpperCase(); … // utilizador define cor for( Object obj: figuras ) { // figuras é contentor ArrayList Figura f = (Figura) obj; if ( f.getCor() == Cor.valueOf( cor ) ) System.out.println( f ); // getCor devolve valor do tipo Cor // imprime só figuras com cor } } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 20/64 Tipos Enumerados Método ordinal Interesse Obter ordem (posição) de um valor // ordem = valor da constante enumerada Declaração public int ordinal() // método de instância Retorna Ordem (posição) do valor sobre o qual é aplicado o método public class Exemplo { public static enum Mes { JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO } public void metodo() { Mes m1 = Mes.DEZEMBRO; // posição 11 Mes m2 = Mes.ABRIL; // posição 3 System.out.println("Faltam " + m1.ordinal () – m2.ordinal () + " meses para o Natal"); ... } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 21/64 Tipos Enumerados Métodos Programados Exemplo: meses do ano - caraterizados pelo nome e nº de dias // conjunto fixo enumerado public enum Mes { // Valores do tipo (Instâncias do tipo) Janeiro(31), Fevereiro(28), Marco(31) { public String toString() { return "Março"; } }, Abril(30), Maio(31), Junho(30), Julho(31), Agosto(31), Setembro(30), Outubro(31), Novembro(30), Dezembro(31); // Variável de instância private int numeroDeDias; // Construtor do tipo (privado) private Mes( int numeroDeDias ) { this.numeroDeDias = numeroDeDias; } // Métodos de instância (aplicados aos valores do tipo. Ex: int d = Mes.Janeiro.numeroDeDias(2013); ) public int numeroDeDias(int ano) { if( ordinal()==1 && anoBissexto(ano) ) return numeroDeDias+1; return numeroDeDias; } public int numeroDeDiasDoAnoCorrente() { Calendar c = Calendar.getInstance(); if( ordinal()==1 && anoBissexto( c.get( Calendar.YEAR ) ) ) return numeroDeDias+1; return numeroDeDias; } public int ordem(){ return ordinal()+1; } // Métodos de classe (aplicados ao tipo. Ex: Mes m = Mes.obterMes(1); ) public static Mes obterMes( int ordem) { return ordem>0 && ordem<13 ? Mes.values()[ordem-1] : null; } private static boolean anoBissexto( int ano ) { return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0; } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 22/64 PPROG Sumário Geral Tipos Enumerados Tipos Genéricos Tipos Coleção Nelson Freire (ISEP–DEI-PPROG 2012/13) 23/64 Genéricos Sumário Definição Tipo Genérico Tipo Parametrizado Interesse Classes e Interfaces Genéricos Parâmetro de Tipo Genérico Nelson Freire (ISEP–DEI-PPROG 2012/13) 24/64 Tipo Genérico Genéricos 1/2 Definição Simples É um tipo com parâmetros de tipos genéricos // genérico = não concreto (Ex típicos: E, T) Identificador (Sintaxe) nome_tipo<lista_parâmetros_tipos_genéricos> // <tipo_genérico_1, ..., tipo-genérico_n> < > operador diamante Exemplo ArrayList<E> // tipo ArrayList genérico // E : parâmetro tipo genérico Parâmetro de Tipo Genérico Permite passar tipo concreto Para dentro da declaração de tipo genérico Interesse Permitir a tipo genérico Criar diferentes tipos concretos Exemplos ArrayList<Pessoa> ArrayList<Figura> public class ArrayList<E> extends … { … public boolean add( E e ) { ensureCapacity(size + 1); elementData[size++] = e; return true; } } Declaração de ArrayList Genérico ArrayList<Contribuinte> Nelson Freire (ISEP–DEI-PPROG 2012/13) 25/64 Tipo Genérico Genéricos 2/2 Definição Completa É um tipo referência (classe ou interface) que usa na sua definição, como parâmetros, um ou mais tipos referência genéricos que serão substituídos por tipos referência concretos na instanciação do tipo genérico Exemplo Tipo genérico de ArrayList ArrayList<E> Concretizações // tipos parametrizados = instanciações do tipo genérico ArrayList<Pessoa> ArrayList<Figura> ArrayList<Contribuinte> Identificador de Tipo Genérico Tem 2 componentes (Ex: ArrayList<E>) Tipo_Referência <Tipo_Ref_1, ..., Tipo_Ref_N> Tipo referência Lista de Parâmetros Lista de parâmetros formais de tipos referência Parâmetros genéricos (Ex típicos: E, T) Representam qualquer tipo referência concreto Nelson Freire (ISEP–DEI-PPROG 2012/13) 26/64 Tipo Parametrizado Genéricos 1/2 Definição Completa Tipo obtido por instanciação do tipo genérico, substituindo os parâmetros de tipo genérico (ex: E) por tipos concretos (ex: Figura) Tipo Genérico ( Ex: ArrayList<E> ) instanciado Tipo Parametrizado ( Ex: ArrayList<Figura> ) substituído (Parâmetro Tipo Genérico) public class ArrayList<E> extends … { (Parâmetro Tipo Concreto) public class ArrayList<Figura> extends … { … … public boolean add( E e ) { public boolean add( Figura e ) { ensureCapacity(size + 1); ensureCapacity(size + 1); elementData[size++] = e; elementData[size++] = e; return true; return true; } } } } Definição Simples Tipo com um ou mais parâmetros de tipo concreto Nelson Freire (ISEP–DEI-PPROG 2012/13) 27/64 Tipo Parametrizado Genéricos 2/2 Pode ser usado em declarações de Variáveis // Ex: ArrayList<Figura> f ; Parâmetros formais de métodos // Ex: public void metodo( ArrayList<Figuras> a ) { … } Tipos de retorno de métodos // Ex: public ArrayList<Figuras> metodo2(){ … } Convenção Identificadores de parâmetros de tipo genérico Usam só 1 letra Típicas E, T, U, etc. Nelson Freire (ISEP–DEI-PPROG 2012/13) 28/64 Interesse Genéricos 1/2 Interesse dos Genéricos Tornar mais segura a programação ... do que a baseada em contentores com elementos Object Eliminando o excessivo downcasting Permitindo ao compilador verificar o tipo de objetos adicionados ao contentor Exemplo do Problema public class Exemplo { public static void main(String[] args) { ArrayList figuras = new ArrayList(); // ArrayList com elementos do tipo Object figuras.add( new Circulo() ); // Preenchimento do contentor figuras.add( new Rectangulo() ); figuras.add( new Pessoa() ); // Adicionado objeto que não é tipo Figura // Compilador aceita qualquer objeto // Provoca apenas erro de execução no ciclo abaixo ... // Algoritmo para calcular e mostrar áreas for( Object obj : figuras ) System.out.println( ( (Figura) obj ).area() ); // downcasting operação insegura } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 29/64 Interesse Genéricos 2/2 Exemplo da Solução public class Exemplo { public static void main(String[] args) { ArrayList<Figura> figuras = new ArrayList()<Figura>(); // ArrayList com elementos do tipo Figura figuras.add( new Circulo() ); // Preenchimento do contentor figuras.add( new Rectangulo() ); figuras.add( new Pessoa() ); // provoca erro de compilação ... // Algoritmo para calcular e mostrar áreas for( Figura fig : figuras ) System.out.println( fig.area() ); // não há downcasting } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 30/64 Classes e Interfaces Genéricos Genéricos Tipos Genéricos podem ser Classes Interfaces Tipos Java podem ser classificados em Tipos parametrizados (genéricos) Tipos não-parametrizados (não-genéricos) Também designados raw types Existem por questões de retrocompatibilidade Na plataforma JCF (desde Java5) Todas as classes e interfaces são genéricos Exceção Tipos Enumerados Nelson Freire (ISEP–DEI-PPROG 2012/13) 31/64 Parâmetro de Tipo Genérico Genéricos Também pode ser um tipo genérico Exemplo Tipo Genérico ArrayList< ArrayList<E> > // Matriz bidimensional // Elementos do tipo E Tipo Parametrizado ArrayList < ArrayList<Figura> > // Matriz bidimensional // Elementos do tipo Figura Elemento 0 ArrayList<Figura> Elemento 1 ArrayList<Figura> Elemento N ArrayList<Figura> Nelson Freire (ISEP–DEI-PPROG 2012/13) 32/64 PPROG Sumário Geral Tipos Enumerados Tipos Genéricos Tipos Coleção Nelson Freire (ISEP–DEI-PPROG 2012/13) 33/64 Coleções Sumário Coleção Natural Noção Processamento em Java Coleção Java Noção Tipos de Organização Java Collections Framework (JCF) Introdução Classes e Interfaces Estrutura dos Interfaces Collection Listas de Tipo List<E> Interface List<E> Classe ArrayList<E> Filas de Espera Classes Arrays Collections Nelson Freire (ISEP–DEI-PPROG 2012/13) 34/64 Noção de Coleção Coleções Coleção Grupo de Itens Exemplos Cartas de um Jogador de Poker Coleção de Cartas Pasta de Correio Eletrónico Coleção de Mensagens Lista Telefónica Nelson Freire (ISEP–DEI-PPROG 2012/13) Nome Telefone António 224529345 Joana 221343455 Coleção de mapeamentos de nomes para telefones 35/64 Coleções Processamento de Coleções Frequente no desenvolvimento de aplicações Java fornece Plataforma de Coleções Java (JCF) Código disponibilizado na Biblioteca Collections Nelson Freire (ISEP–DEI-PPROG 2012/13) http://java.sun.com/javase/technologies/ 36/64 Coleções Noção de Coleção Java Coleção Java É uma estrutura de dados nativa Permite definir contentores de objetos Para servirem de unidades de representação e processamento de um grupo de objetos Armazenam objetos de forma organizada Possuem estrutura e comportamento próprios Objeto X Objeto Y Contentor Objeto Z Coleção Exemplo Coleção com organização Stack (Pilha) Objetos armazenados de forma sequencial (ordenada) // Estrutura Funciona segundo disciplina LIFO (Last In First Out) // Comportameto Nelson Freire (ISEP–DEI-PPROG 2012/13) 37/64 Tipos de Coleções Coleções Tipo Conjunto Características (Set) Implementa um conjunto matemático finito Não há noção de ordem (posição): 1º, 2º, n-ésimo ou último elemento Exemplo Conjunto de artigos científicos Não são permitidos elementos repetidos Lista (List) Implementa uma sequência Há noção de ordem Pasta de correio electrónico São permitidos elementos repetidos Fila de Espera (Queue) Destinada a guardar elementos à espera de serem processados A ordem de processamento é do tipo FIFO Pilha (Stack) Destinada a guardar elementos à espera de serem processados A ordem de processamento é do tipo LIFO Mapeamento (Map) Implementa correspondências unívocas (1 para 1) entre objetos do tipo chave-valor Pedidos de serviço recebidos por um servidor Conjunto de endereços navegados num browser Web Lista Telefónica As chaves são o domínio das correspondências e são únicas Nelson Freire (ISEP–DEI-PPROG 2012/13) 38/64 Coleções Java Collections Framework (JCF) 1/3 Plataforma JCF Surgiu em 1999 Na versão JDK 1.2 (JAVA2) Alterada na JDK 1.5 (JAVA5) de 2004 Devido à introdução de tipos genéricos Pertence à package java.util Disponibiliza múltiplas estruturas de dados Tipos Interfaces Classes abstratas Classes concretas Representam Estruturas de dados usadas frequentemente no desenvolvimento de aplicações Muito genéricas Para processamento de qualquer tipo de dados Propriedades de cada estrutura de dados são independentes do seu conteúdo Exemplo ArrayList para guardar Carros, Livros, Empregados, etc. Muito eficientes Atendendo à importância da JCF, analisemos a sua estrutura interna (a parte que nos interessa) Nelson Freire (ISEP–DEI-PPROG 2012/13) 39/64 Coleções Java Collections Framework (JCF) 2/3 Classes e Interfaces disponibilizados Utilitários para arrays Classe Arrays // Presta serviços a arrays: ordenação, pesquisa, etc. Utilitários para coleções Classe Collections // Presta serviços a coleções: ordenação, pesquisa, etc. Interfaces Collections Definem as APIs essenciais de todas as classes JCF Categorias Conjunto Lista Mapeamento Fila Classes Abstratas Implementações parciais de classes que satisfazem certos interfaces Interesse Criação de subclasses concretas com implementações diferentes Classes Wrapper Exemplos: Integer, Long, Float, Double, Boolean, Character Adicionam funcionalidades a outras classes Permitem a conversão de tipos primitivos em tipos referência e vice-versa Nelson Freire (ISEP–DEI-PPROG 2012/13) 40/64 Java Collections Framework (JCF) Coleções 3/3 Estrutura das Interfaces Collection São interfaces genéricos Map<K,V> Há 2 hierarquias de coleções SortedMap<K,V> Coleções com 1 parâmetro Coleções 2 parâmetros Iterable<E> As correspondências (maps) não herdam de Collection porque têm 2 parâmetros Collection<E> Todas as coleções com 1 parâmetro São de um dos tipos Set<E> List<E> Queue<E> Conjuntos Listas SortedSet<E> Deque<E> Filas Coleções de cada um destes tipos Hierarquias de Interfaces Collection do JCF Têm a mesma API (métodos públicos) Uso simplificado Nelson Freire (ISEP–DEI-PPROG 2012/13) 41/64 Listas de Tipo List<E> Coleções 1/2 List<E> Interface que herda 2 outros interfaces Iterable<E> Classe Abstrata Collection<E> Classe Concreta Queue<E> AbstractCollection<E> List<E> AbstractList<E> Deque<E> AbstractSequentialList<E> LinkedList<E> Vector<E> ArrayList<E> Stack<E> Implementações de List<E> Implementado de formas diferentes ... em classes concretas Exemplos ArrayList<E> // implementa array dinâmico Vector<E> // implementa array dinâmico ... para ambientes multitarefa LinkedList<E> // implementa lista duplamente ligada Stack<E> // implementa pilha Nelson Freire (ISEP–DEI-PPROG 2012/13) 42/64 Coleções Listas de Tipos List<E> 2/2 Classes que implementam interface List<E> Possuem os métodos apresentados na figura Implementação destes métodos deve satisfazer as propriedades de uma lista Sequência de elementos (há ordem) Posição de cada elemento representada por índice inteiro (iniciado em zero) Elementos podem ser inseridos em qualquer posição da lista Pode conter elementos repetidos Pode conter elementos null Nelson Freire (ISEP–DEI-PPROG 2012/13) 43/64 Classe ArrayList<E> Coleções 1/8 É coleção do tipo Lista É tipo List<E> // implementa interface List<E> Implementação Array dinâmico // nº de elementos pode variar durante execução de programa Cresce // adicionando novos elementos Decresce // removendo elementos E1 E1 E2 E1 E2 E3 E1 E2 Array Dinâmico É estrutura de dados indexada Semelhante ao array Índice Indica a posição dos elementos Número inteiro desde zero É tipo genérico Parâmetro E define o tipo de elementos do array Elementos só podem ser instâncias Parâmetro E tem de ser um tipo referência (classe ou interface) Nelson Freire (ISEP–DEI-PPROG 2012/13) 44/64 Classe ArrayList<E> Coleções 2/8 Modelo de Memória (em Execução) RAM ... 1º Elemento ArrayList Parametrizado referência ... N Elemento Stack referência ... atributo 1 Instância ... atributo M ... Heap atributo 1 Instância ... atributo M’ Nelson Freire (ISEP–DEI-PPROG 2012/13) 45/64 Classe ArrayList<E> Coleções 3/8 Declaração de Variável de Tipo ArrayList Parametrizado ArrayList<Figura> figuras; Figura Tipo ArrayList<Figura> é instância do tipo ArrayList<E> Instanciação de um Tipo Parametrizado Circulo Retangulo ArrayList<Figura> figuras = new ArrayList<Figura> (); Tamanho inicial zero // tamanho = nº objetos adicionados Capacidade inicial 10 // capacidade = nº de elementos alocados em memória; >= tamanho ArrayList<Figura> figuras = new ArrayList<Figura> ( 50 ); Capacidade inicial de 50 elementos // 1ªs 50 adições são mais rápidas (sem custos de alocação) Podem ser adicionados mais de 50 elementos Tamanho inicial zero ArrayList<Figura> figuras = new ArrayList<Figura> ( colecao ); colecao é um objeto do tipo Collection<E> Exemplos ArrayList Stack Nelson Freire (ISEP–DEI-PPROG 2012/13) 46/64 Classe ArrayList<E> Coleções 4/8 ArrayList<Figura> figuras2 = figuras.subList(0,5); Atribuídos elementos de outra lista ( elementos de índices [0,5[ do arraylist figuras ) Novos elementos são cópias de referências da outra lista figuras (não são cópias de objetos) figuras e figuras2 partilham objetos Modelo de memória no slide seguinte Modelo de Memória (em Execução) ArrayList figuras 1º Elemento RAM ... referência ... 1º Elemento ArrayList figuras2 Stack referência ... ... atributo 1 objetos ... Heap atributo M ... Nelson Freire (ISEP–DEI-PPROG 2012/13) 47/64 Classe ArrayList<E> Coleções • 5/8 Métodos para Adicionar Elementos boolean add( E e ) adiciona e no final do arraylist e incrementa size de 1 unidade retorna true (sucesso) ou false (insucesso) e pode ser null gera um erro de execução se e não for do tipo E ou null void add( int índice, E e ) desloca uma posição à direita os elementos >= índice e adiciona e na posição índice E set( int índice, E e ) adiciona e na posição índice e retorna o elemento substituído gera erro de execução com índice fora dos limites válidos ( [0, size()[ ) • boolean addAll( Colection c ) boolean addAll( int índice, Collection c ) adiciona todos os elementos da coleção c no final do arraylist insere todos os elementos da coleção c no arraylist, a partir de índice desloca para a direita os elementos >= índice Nelson Freire (ISEP–DEI-PPROG 2012/13) 48/64 Classe ArrayList<E> Coleções • 5/8 Métodos para Remover Elementos void clear() remove todos os elementos do arraylist E remove( int índice ) remove e retorna o elemento índice, deslocando os elementos > índice para o correspondente índice imediata/ inferior gera erro de execução com índice fora dos limites válidos ( [0, size()[ ) boolean remove( Object obj ) remove a 1ª ocorrência de obj no arraylist, caso exista desloca os elementos > índice para o correspondente índice imediata/ inferior retorna true se obj for encontrado; senão, retorna false Nelson Freire (ISEP–DEI-PPROG 2012/13) 49/64 Classe ArrayList<E> Coleções 6/8 Métodos de Pesquisa de Elementos boolean isEmpty() retorna true se o arraylist estiver vazio caso contrário, retorna false boolean contains( Object obj ) retorna true se o arraylist possuir obj caso contrário, retorna false usa método equals de obj boolean containsAll( Collection c ) retorna true se o arraylist possuir todos os elementos de c caso contrário, retorna false gera erro de execução se c = null ou se um ou mais elementos de c forem incompatíveis com o arraylist int indexOf( Object obj ) retorna o índice da 1ª ocorrência de obj no arraylist, caso exista caso não exista, retorna -1 usa método equals de obj int lastIndexOf( Object obj ) Nelson Freire (ISEP–DEI-PPROG 2012/13) semelhante ao anterior, mas relativo à última ocorrência 50/64 Classe ArrayList<E> Coleções 6/8 Outros Métodos int size() retorna o nº de elementos adicionados ao arraylist é diferente de capacidade E get( int índice ) retorna o elemento na posição índice do arraylist gera erro de execução com índice fora dos limites válidos ( [0, size()[ ) String toString() retorna a representação textual do arraylist consiste numa lista, delimitada por parêntesis [ ... ], contendo as representações textuais dos elementos adicionados e separados por vírgulas List<E> subList( int i1, int i2 ) retorna sublista contendo os elementos de índices [i1, i2-1[ retorna referências de objetos (i.e., não objetos) Object clone() retorna cópia do arraylist elementos são cópias de referências partilham objetos com o arraylist clonado Object[] toArray() retorna array contendo todos os elementos do arrayList na mesma ordem Nelson Freire (ISEP–DEI-PPROG 2012/13) 51/64 Classe ArrayList<E> Coleções 7/8 Operações de iteração (varrimento) Para percorrer todos os elementos do arraylist Formas Ciclo for sobre o índice do arraylist ArrayList<String> nomes = new ArrayList<String>(); ... for( int i=0; i < nomes.size(); i++ ){ // tradicional ciclo for sobre arrays System.out.println( nomes.get(i) ) } Operador foreach sobre o ArrayList Sintaxe for( Tipo_Elemento variável : nomeArrayList ){ instruções // sobre variável } Exemplo for( String nome : nomes ){ System.out.println( nome ); // lê-se: para cada nome da lista nomes // nome guarda sucessiva/ cada elemento de nomes } Nelson Freire (ISEP–DEI-PPROG 2012/13) 52/64 Coleções Classe ArrayList<E> 8/8 public class ExemploArrayListGenerico { public static void main( String[] args ) { Figura público area() ArrayList<Figura> a = new ArrayList(); Retangulo r = new Retangulo(); a.add( r ); Circulo público area() a.add( new Circulo() ); Retangulo público area() ... for( Figura f : a ) System.out.printf( "%s Área: %.1f %n", f, f.area() ); System.out.println( "Tamanho do arraylist: " + a.size() ); Figura f1 = a.set( 1, new Retangulo() ); // Substitui figura índice 1 if( a.contains( r ) ) System.out.println( r + " contido no arraylist " ); else System.out.println( r + " não contido no arraylist " ); Figura f2 = a.remove( 0 ); // f2 guarda figura de índice 0 removida de a if ( a.remove( r ) ) System.out.println( r + " Removida"); else System.out.println( r + " Não removida") ; } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 53/64 Filas de Espera de Tipo Queue<E> Coleções Queue<E> Interface que herda 2 outros interfaces Iterable<E> Classe Abstrata Classe Concreta Collection<E> Queue<E> AbstractCollection<E> AbstractQueue<E> Deque<E> LinkedList<E> PriorityQueue<E> Implementações de Queue<E> Implementado de formas diferentes ... em classes concretas. Exemplos: PriorityQueue<E> // implementa fila de espera com elementos ordenados LinkedList<E> // implementa lista duplamente ligada Nelson Freire (ISEP–DEI-PPROG 2012/13) 54/64 Coleções Classe Arrays 1/5 Package java.util Presta serviços A arrays Serviço public static List<T> asList( T[] a ) Converte array num objeto do tipo List<T> import java.util.Arrays; public class Exemplo { public static enum Cor { AMARELO, AZUL, BRANCO} public void metodo() { System.out.println( Arrays.asList( Cor.values() ) ); // imprime: [AMARELO,AZUL,BRANCO] } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 55/64 Classe Arrays Coleções 2/5 Serviço Interface Comparable<T> public static void sort( Object[] a ) público compareTo() Ordena array a de forma ascendente, implementa segundo ordem natural dos elementos Figura Todos elementos do array a têm de ser do tipo Comparable (genérico ou não) Circulo Retangulo import java.util.Arrays; public class ProgramaPrincipal { public static void main(String[] args) { public class Figura implements Comparable<Figura> { private double cor; ... public int compareTo( Figura f ) { if ( area() > f.area() ) return 1; else if ( area() < f.area() ) return -1; else return 0; } Figura[] figuras = new Figura[10]; figuras[0] = new Circulo(); figuras[1] = new Rectangulo(); ... Arrays.sort( figuras ); // pela área for( Figura f : figuras ){ System.out.println( f ); // fig. ordenadas } } } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 56/64 Coleções Classe Arrays 3/5 Serviço Interface Comparator<T> public static void sort( T[] a, Comparator <T> c ) Ordena array a segundo critério de ordenação definido no objeto c (Comparator genérico ou não) Vantagens Não obriga a alterar as classes dos elementos do array Permite ordenar mesmo array usando critérios diferentes público compare() implementa Classe Auxiliar (Anónima) Figura import java.util.Arrays; Circulo public class ProgramaPrincipal { Retangulo public static void main(String[] args) { Figura[] figuras = new Figura[10]; Comparator<Figura> c = new Comparator<Figura>() { figuras[0] = new Circulo(); public int compare( Figura f1, Figura f2 ) { figuras[1] = new Rectangulo(); ... Comparator<Figura> c = ... Arrays.sort( figuras, c ); // pela área double area1 = f1.area(); double area2 = f2.area(); if ( area1 == area2 ) return 0; else if (area 1 > area2 ) return 1; else return -1; for( Figura f : figuras ){ System.out.println( f ); // fig. ordenadas } } } }; // classe anónima, cria 1 objeto } Nelson Freire (ISEP–DEI-PPROG 2012/13) 57/64 Classe Arrays Coleções 4/5 Serviço public static int binarySearch( Object[] a, Object key ) Pesquisa objeto key no array a, usando o algoritmo de pesquisa binária Array deve estar ordenado de forma ascendente, segundo ordem natural dos elementos (usando método Arrays.sort( Object[] a ) ); senão, o resultado é indefinido Retorna índice do objeto key procurado; se houver vários, retorna o índice de um deles; se não for encontrado retorna -1 gera erro de execução se não for possível comparar key com os elementos do array import java.util.Arrays; public class ProgramaPrincipal { public class Figura implements Comparable<Figura> { private double cor; ... public int compareTo( Figura f ) { if ( area() > f.area() ) return 1; else if ( area() < f.area() ) return -1; else return 0; } public static void main(String[] args) { Figura[] figuras = new Figura[10]; figuras[0] = new Circulo(); figuras[1] = new Rectangulo(); ... Figura key = new Circulo(); Arrays.sort( figuras ); int indice = Arrays.binarySearch( figuras, key ); ... } Procura objeto com área de key } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 58/64 Classe Arrays Coleções 5/5 Serviço public static int binarySearch( T[] a, T key , Comparator<T> c ) Pesquisa objeto key no array a, usando algoritmo de pesquisa binária Array deve estar ordenado de forma ascendente, segundo critério de ordenação em c (usando método Arrays.sort( T[] a, Comparator<T> c ) ); senão, o resultado é indefinido Retorna o índice do objeto key procurado; se houver vários, retorna o índice de um deles; retorna -1 se não for encontrado gera um erro de execução se não for possível comparar key com os elementos do array import java.util.Arrays; public class ProgramaPrincipal { public static void main(String[] args) { Figura[] figuras = new Figura[10]; figuras[0] = new Circulo(); figuras[1] = new Rectangulo(); ... Figura key = new Circulo(); Comparator<Figura> c = ... Arrays.sort( figuras, c ); // pela área int indice = Arrays.binarySearch( figuras, key, c ); ... } Comparator<Figura> c = new Comparator<Figura>() { public int compare( Figura f1, Figura f2 ) { double area1 = f1.area(); double area2 = f2.area(); if ( area1 == area2 ) return 0; else if (area 1 > area2 ) return 1; else return -1; } }; // classe anónima, cria 1 objeto Procura objeto com área de key } Nelson Freire (ISEP–DEI-PPROG 2012/13) 59/64 Classe Collections Coleções 1/5 Package java.util Presta serviços A coleções Serviço public static void shuffle( List<?> lista ) Faz permutas aleatórias dos elementos da lista passada por parâmetro import java.util.Collections; public class Exemplo { public static void main(String[] args) { ArrayList<Carta> cartas = new ArrayList<Carta>(); // para guardar cartas de jogo cartas.add( new Carta(Naipe.PAUS, Tipo.DAMA) ); // Naipe e Tipo - tipos enumerados cartas.add( new Carta(Naipe.OUROS, Tipo.REI) ); ... cartas.shuffle(); ... // cartas baralhadas } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 60/64 Classe Collections Coleções 2/5 Serviço Interface Comparable<T> public static void sort( List<T> lista ) público compareTo() Ordena a lista de forma ascendente, implementa segundo a ordem natural dos elementos Figura Todos elementos da lista têm de ser do tipo Comparable (genérico ou não) Circulo Retangulo import java.util.Collections; public class Figura implements Comparable<Figura> { public class ProgramaPrincipal { private double cor; ... public int compareTo( Figura f ) { if ( area() > f.area() ) return 1; else if ( area() < f.area() ) return -1; else return 0; } public static void main(String[] args) { ArrayList<Figura> figuras = new ArrayList<Figura>(); figuras.add( new Circulo() ); figuras.add( new Rectangulo() ); ... Collections.sort( figuras ); // pela área for( Figura f : figuras ) System.out.println( f ); // figuras ordenadas } } } Nelson Freire (ISEP–DEI-PPROG 2012/13) 61/64 Coleções Classe Collections 3/5 Serviço public static void sort( List<T> lista, Comparator<T> c ) Ordena a lista segundo critério de ordenação definido no objeto c (Comparator genérico ou não) Vantagens Não obriga a alterar as classes dos elementos da lista Permite ordenar a mesma lista usando critérios diferentes import java.util.Collections; Interface Comparator<T> público compare() implementa Classe Auxiliar (Anónima) Figura Circulo Retangulo public class ProgramaPrincipal { public static void main(String[] args) { ArrayList<Figura> figuras = new ArrayList<Figura>(); figuras.add( new Circulo() ); figuras.add( new Rectangulo() ); ... Comparator<Figura> c = ... Collections.sort( figuras, c ); // pela área for( Figura f : figuras ) System.out.println( f ); // figuras ordenadas Comparator<Figura> c = new Comparator<Figura>() { public int compare( Figura f1, Figura f2 ) { double area1 = f1.area(); double area2 = f2.area(); if ( area1 == area2 ) return 0; else if (area 1 > area2 ) return 1; else return -1; } } Nelson Freire (ISEP–DEI-PPROG 2012/13) } }; // classe anónima, cria 1 objeto 62/64 Classe Collections Coleções 4/5 Serviço public static int binarySearch( List<T> lista, T key ) Pesquisa objeto key na lista, usando algoritmo de pesquisa binária A lista deve estar ordenada de forma ascendente, segundo ordem natural dos elementos (usando o método Arrays.sort( List<T> lista ) ); senão, o resultado é indefinido Retorna índice do objeto key procurado; se houver vários, retorna o índice de um deles; se não for encontrado retorna -1 gera erro de execução se key não puder ser comparado com os elementos da lista import java.util.Collections; public class ProgramaPrincipal { public class Figura implements Comparable<Figura> { private double cor; ... public int compareTo( Figura f ) { if ( area() > f.area() ) return 1; else if (area() < f.area() ) return -1; else return 0; } public static void main(String[] args) { ArrayList<Figura> figuras = new ArrayList<Figura>(); figuras.add( new Circulo() ); figuras.add( new Rectangulo() ); ... Figura key = new Circulo(); Collections.sort( figuras ); int indice = Collections.binarySearch( figuras, key ); ... } Procura objeto com área de key } Nelson Freire (ISEP–DEI-PPROG 2012/13) } 63/64 Classe Collections Coleções 5/5 Serviço public static int binarySearch( List<T> lista, T key , Comparator<T> c ) Pesquisa o objeto key na lista, usando o algoritmo de pesquisa binária A lista deve estar ordenada de forma ascendente, segundo critério de ordenação em c (usando o método Arrays.sort( T[] a, Comparator<T> c ) ); senão, o resultado é indefinido Retorna o índice do objeto key procurado; se houver vários, retorna o índice de um deles; retorna -1 se não for encontrado gera um erro de execução se não for possível comparar key com os elementos do array import java.util.Collections; public class ProgramaPrincipal { public static void main(String[] args) { ArrayList<Figura> figuras = new ArrayList<Figura>(); figuras.add( new Circulo() ); figuras.add( new Rectangulo() ); ... Figura key = new Circulo(); Comparator<Figura> c = ... Collections.sort( figuras, c ); // pela área int indice = Collections.binarySearch( figuras, key, c ); ... } Comparator<Figura> c = new Comparator<Figura>(){ public int compare( Figura f1, Figura f2 ) { double area1 = f1.area(); double area2 = f2.area(); if ( area1 == area2 ) return 0; else if (area 1 > area2 ) return 1; else return -1; Procura objeto com área de key } Nelson Freire (ISEP–DEI-PPROG 2012/13) } }; // classe anónima, cria 1 objeto 64/64