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