enumerados genéricos coleções - dei.isep.ipp.ptdei.isep.ipp.pt/~nfreire/java - tipos enumerados....
TRANSCRIPT
Nelson Freire (ISEP–DEI-PPROG 2012/13) 1/64
Tipos de Dados Enumerados
Genéricos
Coleções
Paradigmas da Programação PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 2/64
Tipos Enumerados
Tipos Genéricos
Tipos Coleção
Sumário Geral PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 3/64
Tipos Enumerados
Tipos Genéricos
Tipos Coleção
Sumário Geral PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 4/64
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
Sumário Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 5/64
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 }
Interesse Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 6/64
Tipo Enumerado
É um tipo de dados
Definido pelo utilizador
Valores são constantes ... enumeradas automaticamente desde zero
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 }
Definição de um Tipo Enumerado
Constante 1 Constante 2 Constante 3 ... Constante N
0 1 2 N-1 ... Ordem
Valores do tipo
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 7/64
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
Implementação de um Tipo Enumerado Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 8/64
Pode ser
Classe Independente // Dentro de package
Classe Interna // Dentro de classes e interfaces
Declaração : Localização 1/3
Netbeans 1. Clique direito na package 2. New Java Enum
Constantes de Interfaces Por omissão
public static final
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 9/64
Sintaxe
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
Declaração : Classe Independente 2/3
[modificador de acesso] enum nome { constante1, constante2, ..., constanteN }
Constantes enumeradas desde 0
AMARELO=0 ; AZUL=1 ; BRANCO=2 ; ENCARNADO=3
[...] significa opcional
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 10/64
Como atributo
Sintaxe
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
Proibida num método
Declaração : Classe Interna de uma Classe
public class Exemplo { ... public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } // public acesso exterior … }
3/3
public class Exemplo { … public void metodo() { enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } } }
[modificador de acesso] [static] enum nome { constante1, constante2, ..., constanteN }
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 11/64
Referir um valor
Caso Geral
Sintaxe
tipo_enumerado.constante_enumerada
// prefixo operador_ponto nome_constante
Exemplos
Caso Particular
Tipo enumerado declarado como classe interna
Indicação no exterior da classe hospedeira
Sintaxe
Classe_hospedeira.tipo_enumerado.constante_enumerada
Exemplos
Valor de um Tipo Enumerado Tipos Enumerados
Cor.ENCARNADO; // indica valor ENCARNADO do tipo Cor
Cor.AMARELO; // indica valor AMARELO do tipo Cor
Exemplo.Cor.ENCARNADO; // indica valor ENCARNADO do tipo Exemplo.Cor
Exemplo.Cor.AMARELO; // indica valor AMARELO do tipo Exemplo.Cor
public class Exemplo { public static enum Cor { ... } // public acesso exterior … }
Nelson Freire (ISEP–DEI-PPROG 2012/13) 12/64
Declaração
Sintaxe
tipo_enumerado nome_variável [= valor_do_tipo_enumerado];
Exemplo
Só pode guardar valores do tipo enumerado declarado
Exemplo
Variável c só pode armazenar valores do tipo enumerado Cor
Variável de um Tipo Enumerado
public class Exemplo {
public static enum Cor { AMARELO, AZUL, BRANCO, ENCARNADO } …
public void metodo() {
Cor c; // inicializada a null, por omissão ... } }
Cor c = Cor.ENCARNADO;
c = Cor.BRANCO;
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 13/64
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
Método name
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 } }
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 14/64
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
Método toString 1/2 Tipos
Enumerados
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) 15/64
Pode ser redefinido para cada valor
Exemplo
Método toString 2/2
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"
}
}
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 16/64
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
Método values
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() } }
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 17/64
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 // método de instância
-1 // valor1 < valor2 0 // valor1 = valor2 1 // valor1 > valor2
Método compareTo
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 "); } }
Exemplo valor1.compareTo( valor2 )
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 18/64
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
Método equals
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 ) ) // Equivalente : f.getCor() == Cor.ENCARNADO
System.out.println( f ); // imprime só figuras de cor ENCARNADO } } }
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 19/64
Interesse
Converter nome dum valor no valor correspondente
Exemplo
Declaração
public static tipo_enumerado valueOf(String name)
Método de classe (static)
Aplicado ao tipo enumerado
Exemplo
Retorna
Valor com nome passado por parâmetro
Exemplo
Caso não exista valor com esse nome
Gerado erro de execução Lançada exceção IllegalArgumentException
Exemplo
Método valueOf 1/2 Tipos
Enumerados
Cor c = Cor.valueOf ("BRANCO"); // c = Cor.BRANCO
Cor.valueOf ("BRANCO")
Ex: Cor.valueOf ("branco")
"BRANCO" Cor.BRANCO
Nelson Freire (ISEP–DEI-PPROG 2012/13) 20/64
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 ) ) // getCor devolve valor do tipo Cor
System.out.println( f ); // imprime só figuras com cor
} }
}
Método valueOf 2/2 Tipos
Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 21/64
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
Método ordinal
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");
...
} }
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 22/64
Exemplo: meses do ano - caraterizados pelo nome e nº de dias // conjunto fixo enumerado
Métodos Programados
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; }
}
Tipos Enumerados
Nelson Freire (ISEP–DEI-PPROG 2012/13) 23/64
Tipos Enumerados
Tipos Genéricos
Tipos Coleção
Sumário Geral PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 24/64
Definição
Tipo Genérico
Tipo Parametrizado
Interesse
Classes e Interfaces Genéricos
Parâmetro de Tipo Genérico
Sumário Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 25/64
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>
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>
ArrayList<Contribuinte>
Tipo Genérico 1/2 Genéricos
public class ArrayList<E> extends … { … public boolean add( E e ) { ensureCapacity(size + 1); elementData[size++] = e; return true; } }
Declaração de ArrayList Genérico
< > operador diamante
Nelson Freire (ISEP–DEI-PPROG 2012/13) 26/64
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
Lista de parâmetros formais de tipos referência
Parâmetros genéricos (Ex típicos: E, T)
Representam qualquer tipo referência concreto
Tipo_Referência <Tipo_Ref_1, ..., Tipo_Ref_N> Lista de Parâmetros
Tipo Genérico 2/2 Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 27/64
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)
Definição Simples
Tipo com um ou mais parâmetros de tipo concreto
Tipo Parametrizado
(Parâmetro Tipo Genérico) (Parâmetro Tipo Concreto)
public class ArrayList<E> extends … {
…
public boolean add( E e ) {
ensureCapacity(size + 1);
elementData[size++] = e;
return true;
} }
public class ArrayList<Figura> extends … {
…
public boolean add( Figura e ) {
ensureCapacity(size + 1);
elementData[size++] = e;
return true;
} }
Tipo Genérico ( Ex: ArrayList<E> )
Tipo Parametrizado ( Ex: ArrayList<Figura> )
instanciado
substituído
1/2 Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 28/64
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.
Tipo Parametrizado 2/2 Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 29/64
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
Interesse 1/2 Genéricos
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) 30/64
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 } }
Interesse 2/2 Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 31/64
Classes e Interfaces 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
Genéricos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 32/64
Parâmetro de Tipo Genérico
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
Genéricos
ArrayList<Figura> Elemento 0
Elemento 1
Elemento N
ArrayList<Figura>
ArrayList<Figura>
Nelson Freire (ISEP–DEI-PPROG 2012/13) 33/64
Tipos Enumerados
Tipos Genéricos
Tipos Coleção
Sumário Geral PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 34/64
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
Sumário Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 35/64
Noção de Coleção Coleção
Grupo de Itens
Exemplos
Cartas de um Jogador de Poker
Pasta de Correio Eletrónico
Lista Telefónica
Coleção de Cartas
Coleção de Mensagens
Nome Telefone
António 224529345
Joana 221343455
Coleção de mapeamentos de nomes para telefones
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 36/64
Processamento de Coleções Frequente no desenvolvimento de aplicações
Java fornece Plataforma de Coleções Java (JCF)
Código disponibilizado na Biblioteca Collections
Coleções
http://java.sun.com/javase/technologies/
Nelson Freire (ISEP–DEI-PPROG 2012/13) 37/64
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
Exemplo
Coleção com organização Stack (Pilha)
Objetos armazenados de forma sequencial (ordenada) // Estrutura
Funciona segundo disciplina LIFO (Last In First Out) // Comportameto
Objeto X
Objeto Y
Objeto Z
Coleção
Contentor
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 38/64
Tipos de Coleções
Tipo Características Exemplo
Conjunto (Set) Implementa um conjunto matemático finito
Não há noção de ordem (posição): 1º, 2º, n-ésimo ou último elemento
Não são permitidos elementos repetidos
Conjunto de artigos científicos
Lista (List) Implementa uma sequência
Há noção de ordem
São permitidos elementos repetidos
Pasta de correio electrónico
Fila de Espera (Queue) Destinada a guardar elementos à espera de serem processados
A ordem de processamento é do tipo FIFO
Pedidos de serviço recebidos por um servidor
Pilha (Stack) Destinada a guardar elementos à espera de serem processados
A ordem de processamento é do tipo LIFO
Conjunto de endereços navegados num browser Web
Mapeamento (Map) Implementa correspondências unívocas (1 para 1) entre objetos do tipo chave-valor
As chaves são o domínio das correspondências e são únicas
Lista Telefónica
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 39/64
Java Collections Framework (JCF) 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)
1/3 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 40/64
Java Collections Framework (JCF) 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
2/3 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 41/64
Java Collections Framework (JCF) Estrutura das Interfaces Collection
São interfaces genéricos
Há 2 hierarquias de coleções
Coleções com 1 parâmetro
Coleções 2 parâmetros
As correspondências (maps) não herdam de
Collection porque têm 2 parâmetros
Todas as coleções com 1 parâmetro
São de um dos tipos
Conjuntos
Listas
Filas
Coleções de cada um destes tipos
Têm a mesma API (métodos públicos)
Uso simplificado
3/3
Map<K,V>
SortedMap<K,V>
Collection<E>
SortedSet<E>
Iterable<E>
Set<E> List<E> Queue<E>
Deque<E>
Hierarquias de Interfaces Collection do JCF
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 42/64
List<E> Interface que herda 2 outros interfaces
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
Listas de Tipo List<E> 1/2 Coleções
Collection<E>
Iterable<E>
List<E>
Deque<E>
Queue<E>
Implementações de List<E>
ArrayList<E> LinkedList<E> Vector<E>
Stack<E>
AbstractCollection<E>
AbstractList<E>
AbstractSequentialList<E>
Classe Abstrata
Classe Concreta
Nelson Freire (ISEP–DEI-PPROG 2012/13) 43/64
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
Listas de Tipos List<E> 2/2 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 44/64
É 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
É 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)
Classe ArrayList<E> 1/8
E1 E1 E2 E1 E2 E3
Array Dinâmico
E1 E2
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 45/64
Modelo de Memória (em Execução)
RAM
referência
...
N Elemento
...
atributo 1
Instância
Heap
Stack
atributo M
...
atributo 1
atributo M’
...
...
...
Instância
referência 1º Elemento
ArrayList Parametrizado
Classe ArrayList<E> 2/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 46/64
Declaração de Variável de Tipo ArrayList Parametrizado
Tipo ArrayList<Figura> é instância do tipo ArrayList<E>
Instanciação de um Tipo Parametrizado
Tamanho inicial zero // tamanho = nº objetos adicionados
Capacidade inicial 10 // capacidade = nº de elementos alocados em memória; >= tamanho
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
colecao é um objeto do tipo Collection<E>
Exemplos ArrayList Stack
Figura
Retangulo Circulo
ArrayList<Figura> figuras = new ArrayList<Figura> ();
ArrayList<Figura> figuras = new ArrayList<Figura> ( 50 );
ArrayList<Figura> figuras;
Classe ArrayList<E> 3/8
ArrayList<Figura> figuras = new ArrayList<Figura> ( colecao );
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 47/64
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
RAM
referência
...
1º Elemento
...
atributo 1
objetos Heap
Stack
atributo M
...
...
...
referência 1º Elemento ArrayList figuras
... ArrayList figuras2
Modelo de Memória (em Execução)
Classe ArrayList<E> 4/8
ArrayList<Figura> figuras2 = figuras.subList(0,5);
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 48/64
• 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 ) adiciona todos os elementos da coleção c no final do arraylist
boolean addAll( int índice, Collection c ) insere todos os elementos da coleção c no arraylist, a partir de índice
desloca para a direita os elementos >= índice
Classe ArrayList<E> 5/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 49/64
• 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
Classe ArrayList<E> 5/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 50/64
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 ) semelhante ao anterior, mas relativo à última ocorrência
Classe ArrayList<E> 6/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 51/64
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
Classe ArrayList<E> 6/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 52/64
Operações de iteração (varrimento)
Para percorrer todos os elementos do arraylist
Formas
Ciclo for sobre o índice do arraylist
Operador foreach sobre o ArrayList
Sintaxe
Exemplo
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) )
}
for( Tipo_Elemento variável : nomeArrayList ){
instruções // sobre variável }
for( String nome : nomes ){ // lê-se: para cada nome da lista nomes
System.out.println( nome ); // nome guarda sucessiva/ cada elemento de nomes }
Classe ArrayList<E> 7/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 53/64
public class ExemploArrayListGenerico {
public static void main( String[] args ) {
ArrayList<Figura> a = new ArrayList();
Retangulo r = new Retangulo();
a.add( r );
a.add( new Circulo() );
...
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") ;
}
}
Figura
público area()
Retangulo
público area()
Circulo
público area()
Classe ArrayList<E> 8/8 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 54/64
Queue<E> Interface que herda 2 outros interfaces
Implementado de formas diferentes ... em classes concretas.
Exemplos:
PriorityQueue<E> // implementa fila de espera com elementos ordenados
LinkedList<E> // implementa lista duplamente ligada
Filas de Espera de Tipo Queue<E> Coleções
Collection<E>
Iterable<E>
Queue<E>
Implementações de Queue<E>
PriorityQueue<E>
AbstractCollection<E>
AbstractQueue<E>
Deque<E>
LinkedList<E>
Classe Abstrata
Classe Concreta
Nelson Freire (ISEP–DEI-PPROG 2012/13) 55/64
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]
}
}
Classe Arrays 1/5 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 56/64
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; } }
Serviço
public static void sort( Object[] a )
Ordena array a de forma ascendente,
segundo ordem natural dos elementos
Todos elementos do array a têm de ser do tipo
Comparable (genérico ou não)
Classe Arrays 2/5
Circulo Retangulo
Interface Comparable<T>
implementa
Figura
público compareTo()
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(); ... Arrays.sort( figuras ); // pela área
for( Figura f : figuras ){
System.out.println( f ); // fig. ordenadas } }
}
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 57/64
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
Serviço
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
Classe Arrays 3/5
Circulo Retangulo
Figura
implementa
Classe Auxiliar (Anónima)
Interface Comparator<T>
público compare()
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(); ... Comparator<Figura> c = ... Arrays.sort( figuras, c ); // pela área
for( Figura f : figuras ){ System.out.println( f ); // fig. ordenadas } }
}
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 58/64
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
Classe Arrays 4/5
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; } }
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(); Arrays.sort( figuras ); int indice = Arrays.binarySearch( figuras, key ); ... }
} Procura objeto com área de key
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 59/64
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
Classe Arrays 5/5
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
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 );
... }
}
Procura objeto com área de key
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 60/64
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 ... }
}
Classe Collections 1/5 Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 61/64
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; } }
Serviço
public static void sort( List<T> lista )
Ordena a lista de forma ascendente,
segundo a ordem natural dos elementos
Todos elementos da lista têm de ser do tipo
Comparable (genérico ou não)
Classe Collections 2/5
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() ); ... Collections.sort( figuras ); // pela área
for( Figura f : figuras )
System.out.println( f ); // figuras ordenadas }
}
Circulo Retangulo
Interface Comparable<T>
implementa
Figura
público compareTo()
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 62/64
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
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
Classe Collections 3/5
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() ); ... Comparator<Figura> c = ... Collections.sort( figuras, c ); // pela área for( Figura f : figuras ) System.out.println( f ); // figuras ordenadas
} }
Circulo Retangulo
Figura
implementa
Classe Auxiliar (Anónima)
Interface Comparator<T>
público compare()
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 63/64
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
Classe Collections 4/5
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; } }
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(); Collections.sort( figuras ); int indice = Collections.binarySearch( figuras, key );
... }
}
Procura objeto com área de key
Coleções
Nelson Freire (ISEP–DEI-PPROG 2012/13) 64/64
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
Classe Collections 5/5
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
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 ); ...
} }
Procura objeto com área de key
Coleções