Tipo Enumerado - Dei-Isep

Propaganda
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
Download