linguagem java - dei.isep.ipp.ptnfreire/java - contentores.pdf · nelson freire (isep–dei-pprog...
TRANSCRIPT
Nelson Freire (ISEP–DEI-PPROG 2012/13) 1/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 1/33
Linguagem JAVA Contentores de Objetos
Paradigmas da Programação PPROG
Nelson Freire (ISEP–DEI-PPROG 2012/13) 2/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 2/33
Noção de Contentor
Categorias de Contentores
Conjunto
Lista
Fila de Espera
Pilha
Mapeamento
Exemplos
Array
ArrayList
Lista Ligada
Sumário Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 3/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 3/33
Estrutura de Dados
Permite armazenar múltiplos objetos
Objeto X
Objeto Y
Objeto Z
Contentor
Noção de Contentor Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 4/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 4/33
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 entre elementos
São permitidos elementos repetidos
Pasta de correio electrónico (mensagens guardadas pela ordem de chegada)
Fila de Espera (Queue) Destinada a guardar elementos à espera de serem processados
A ordem de processamento é do tipo FIFO
Conjunto de 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
Categorias de Contentores Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 5/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 5/33
Noção de Contentor
Categorias de Contentores
Conjunto
Lista
Fila de Espera
Pilha
Mapeamento
Exemplos
Array
ArrayList
Lista Ligada
Sumário Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 6/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 6/33
Guardar uma lista de objetos
Objetos todos do mesmo tipo (ou compatíveis) // ex: só objetos Automovel ou Livro ou Pessoa
Lista de dimensão fixa
Exemplos
Interesse dos Arrays Arrays
Objeto 1
Objeto 2
Objeto 3
...
Objeto N
Tabela Unidimensional (Dimensão N)
Objeto 1,1 ... Objeto 1,M
Objeto 2,1 ... Objeto 2,M
Objeto 3,1 ... Objeto 3,M
... ... ...
Objeto N,1 ... Objeto N,M
Tabela Bidimensional (Dimensão NxM)
Nelson Freire (ISEP–DEI-PPROG 2012/13) 7/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 7/33
Unidimensionais
Multidimensionais
Bidimensionais
Tridimensionais
...
Categorias de Arrays Arrays
Nelson Freire (ISEP–DEI-PPROG 2012/13) 8/33
Array
Constituído por elementos
Nº de elementos (comprimento) é fixo // Dimensão não modificável em tempo de execução
Elementos
Organizados de forma linear
Funcionam como variáveis simples
Podem armazenar objetos
Todos do mesmo tipo (ou tipos compatíveis)
Acesso através de índices
Índice
Indica posição de um elemento
Nº inteiro: [0, comprimento -1]
• Indexados // Índice; nº inteiro desde 0
0 1 2 3 ... n-2
n-1
objeto objeto objeto X objeto ... objeto objeto
Elemento: 2 Conteúdo: Objeto X
comprimento (ou dimensão) n
elementos
índices
Noção de Array Unidimensional Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 9/33
Preciso Saber
Declarar um array
Java
Arrays são objetos
Manipular elementos do array
Uso Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 10/33
Java
tipo nomeArray[ ] = new tipo[ dimensão ];
tipo[ ] nomeArray = new tipo[ dimensão ];
tipo nomeArray[ ]; nomeArray = new tipo[ dimensão ];
Exemplos
Automovel autos[ ] = new Automovel [20];
Automovel[ ] autos = new Automovel [20];
Automovel autos [ ]; autos[ ] = new Automovel[20];
Inicialização dos Elementos
RAM
autos[0]
autos[1]
autos[2]
autos[19]
...
19 = 20-1
Tipo referência: null (Ex: Automovel)
• Array é objeto
• Nome do array é referência de objeto
Declaração de Array Unidimensional Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 11/33
Java: Array é um Objeto
RAM
autos[0]
autos[1]
autos[2]
autos[19]
...
...
referência de objeto
...
autos
...
Objeto
Nome de Array
• É uma referência do objeto que contém os seus elementos // referência = endereço
Exemplo
• Automovel[] autos = new Automovel[20];
Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 12/33
Elemento
Pode ser manipulado individualmente
Funciona como uma variável simples
Identificado pelo
Nome do vetor
Índice respetivo
Indicar Elemento
nomeArray[índice]
Exemplo
autos[2]
Manipulações Típicas
Um elemento
Todos elementos
Manipulação de Elementos
RAM
autos[0]
autos[1]
autos[2]
autos[19]
...
...
referência de objeto
...
autos
...
Objeto
Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 13/33
Atribuir objeto a um elemento
• Guardar ou atualizar um elemento
• Sintaxe: nomeArray[índice] = objeto;
Ex: autos[5] = new Automovel("Toyota");
Atribuir conteúdo de elemento a uma variável
• Sintaxe: variável = nomeArray[índice];
Ex: Automovel a = autos[5];
Manipulação de um Elemento Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 14/33
nomeArray.length (atributo)
Sintaxe da repetição foreach:
for( Tipo_Elemento variável: nomeArray ){
instruções // sobre variável
}
Indicar todos os n elementos (n = comprimento do array)
for(int i=0; i < nomeArray.length; i++ ){
... nomeArray[i] ...
}
Ex: Guardar no array n instâncias Automovel
for(int i=0; i<autos.length; i++){
autos[i] = new Automovel();
}
Ex: Mostrar as instâncias Automovel guardadas no array
for(int i=0; i<autos.length; i++){
if ( autos[i] != null )
System.out.println( autos[i] );
}
// Alternativa com foreach
for(Automovel a: autos)
if ( a != null )
System.out.println(a);
}
Manipulação de Todos os Elementos Array Unidimensional
Nelson Freire (ISEP–DEI-PPROG 2012/13) 15/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 15/33
Noção de Contentor
Categorias de Contentores
Conjunto
Lista
Fila de Espera
Pilha
Mapeamento
Exemplos
Array
ArrayList
Lista Ligada
Sumário Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 16/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 16/33
Classe
Instanciável
Uma instância
Contentor de objetos
Tipo lista
Há ordem nos objetos (1º, 2º, ..., N)
Fornece serviços para gerir objetos
Exemplos
Adicionar objetos
Remover objetos
Tipo coleção
Implementa interface Collection
Objeto X
Objeto Y
Objeto Z
Elemento 1
Elemento 2
Elemento N
Contentor
Noção de ArrayList ArrayList
Elementos contêm Objetos
Nelson Freire (ISEP–DEI-PPROG 2012/13) 17/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 17/33
ArrayList Implementa
Array dinâmico // nº de elementos pode variar durante execução de programa
Cresce // adicionando novos objetos
Decresce // removendo objetos
Baseado num array
E1 E1 E2 E1 E2 E3
Array Dinâmico
E1 E2
ArrayList Implementação de um ArrayList 1/2
Nelson Freire (ISEP–DEI-PPROG 2012/13) 18/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 18/33
Elementos
Tipo Object
Compatível com todos os tipos
Armazenam qualquer objeto
Estrutura de dados indexada
Semelhante ao array
Índice
Indica posição dos elementos
Número inteiro desde zero
ArrayList Implementação de um ArrayList 2/2
Nelson Freire (ISEP–DEI-PPROG 2012/13) 19/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 19/33
RAM
referência
...
Elemento m
...
atributo 1
objeto
atributo N
...
atributo 1
atributo M
...
...
...
objeto
referência Elemento 1
ArrayList
Modelo de Memória ArrayList
Nelson Freire (ISEP–DEI-PPROG 2012/13) 20/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 20/33
ArrayList
Construtores
Métodos de Instância
API (Application Programming Interface) 1/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 21/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 21/33
Construtores
public ArrayList() // tamanho inicial zero ( nº de objetos adicionados )
// capacidade inicial 10 (nº de elementos alocados)
// primeiras 10 adições rápidas (s/ custos realocação)
public ArrayList(int capacidade_inicial); // tamanho inicial zero
public ArrayList(Collection<? extends E> c); // permite copiar arrayList recebido por parâmetro
// há partilha de objetos
ArrayList
public class ExemploArrayList {
public static void main(String[] args) {
...
ArrayList plantel_1 = new ArrayList(); // declaração e instanciação
...
ArrayList plantel_2 = new ArrayList(25);
...
ArrayList plantel_3 = new ArrayList(plantel_2);
}
}
API (Application Programming Interface) 2/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 22/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 22/33
Métodos para adicionar objetos
boolean add(Object obj) adiciona obj no final da lista e incrementa tamanho de 1 unidade
retorna true (sucesso) ou false (insucesso)
pode ser adicionado null
void add(int índice, Object obj) adiciona obj na posição índice
desloca uma posição à direita objetos, desde a posição índice
Object set(int índice, Object obj) adiciona obj na posição índice
se estiver ocupada, objeto atual é substituído
se índice >= size() ou < 0, é gerado um erro de execução public class ExemploArrayList {
public static void main(String[] args) {
ArrayList plantel = new ArrayList();
plantel.add( "Nico" );
plantel.add( "Bruno" );
plantel.add( 1, "Artur" );
plantel.set( 1, "Eduardo" );
}
}
ArrayList API (Application Programming Interface) 3/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 23/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 23/33
Métodos para remover objetos
void clear() remove todos os objetos da lista (tamanho=0, capacidade =)
Object remove(int índice) remove objeto na posição índice
desloca objetos de índice superior para índice imediata/ inferior
boolean remove(Object obj) remove a 1ª ocorrência de obj na lista, caso exista
desloca objetos de índice superior para índice imediata/ inferior
public class ExemploArrayList {
public static void main(String[] args) {
ArrayList plantel = new ArrayList();
...
plantel.remove(2);
plantel.remove("Bruno");
plantel.clear();
}
}
ArrayList API (Application Programming Interface) 4/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 24/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 24/33
Métodos para pesquisar objetos
boolean isEmpty() retorna true se lista estiver vazia; caso contrário, retorna false
boolean contains(Object obj) retorna true se obj estiver na lista; caso contrário, retorna false
usa o método equals de obj
int indexOf(Object obj) retorna o índice da 1ª ocorrência de obj na lista, caso exista
caso não exista, retorna -1; usa o método equals de obj
int lastIndexOf(Object obj) semelhante ao anterior, mas relativo à última ocorrência
public class ExemploArrayList {
public static void main(String[] args) {
ArrayList plantel = new ArrayList();
...
System.out.println( plantel.isEmpty() ? "Não Há Jogo" : "Há Jogo" );
System.out.println( plantel.contains("Artur") ? "Vence" : "Perde" );
System.out.println( "Posição= " + plantel.indexOf("Artur") );
}
}
ArrayList API (Application Programming Interface) 5/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 25/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 25/33
Outros métodos
int size() retorna nº de objetos adicionados à lista
diferente de capacidade
Object get(int índice) retorna objeto guardado na posição índice
Object[] toArray() retorna array contendo todos os objetos do arrayList
mantém ordem dos objetos
ArrayList nomes = new ArrayList();
...
for( int i=0; i < nomes.size(); i++ ){ // tradicional ciclo for sobre arrays
if( nomes.get(i) != null )
System.out.println( nomes.get(i) )
}
...
Object[] nomes = nomes.toArray();
ArrayList API (Application Programming Interface) 6/6
Nelson Freire (ISEP–DEI-PPROG 2012/13) 26/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 26/33
Operações de iteração (varrimento)
Para percorrer todos os elementos da lista
Formas
Ciclo for sobre o índice da lista
Repetição foreach sobre o ArrayList
Sintaxe
Exemplo
ArrayList nomes = new ArrayList();
...
for( int i=0; i < nomes.size(); i++ ){ // tradicional ciclo for sobre arrays
if( nomes.get(i)!= null )
System.out.println( nomes.get(i) )
}
for( Tipo_Elemento variável: nomeArrayList ){
instruções // sobre variável
}
for( Object obj : nomes ){ // lê-se: para cada obj da lista nomes faz
if( obj!=null ) // arrayList pode ter elementos null
System.out.println( obj );
}
Iterações ArrayList
Nelson Freire (ISEP–DEI-PPROG 2012/13) 27/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 27/33
public class ExemploArrayList {
public static void main(String[] args) {
ArrayList plantel = new ArrayList();
plantel.add( "Nico" );
plantel.add( "John" );
plantel.add( "Cardoso" );
for (Object obj : plantel) {
if( obj!=null )
System.out.println(obj); // obj = obj.toString()
}
System.out.println( "Tamanho do arraylist: " + plantel.size() );
System.out.println( "2º jogador:" + plantel.get( 1 ) );
plantel.set( 1, "Salvio" ); // Substitui o 2º jogador
plantel.remove( 0 ); // Remove 1º jogador
plantel.remove( "Cardoso" ); // Remove jogador passado por parâmetro
if( plantel.contains( "Eusébio" ) )
System.out.println( "Eusébio faz parte do plantel" );
else
System.out.println( "Eusébio não faz parte do plantel" );
}
}
Exemplo ArrayList
Nelson Freire (ISEP–DEI-PPROG 2012/13) 28/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 28/33
Noção de Contentor
Categorias de Contentores
Conjunto
Lista
Fila de Espera
Pilha
Mapeamento
Exemplos
Array
ArrayList
Lista Ligada
Sumário Contentores
Nelson Freire (ISEP–DEI-PPROG 2012/13) 29/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 29/33
Contentor do tipo Lista
Permite guardar uma sequência de objetos
Estabelece relação de ordem entre objetos
1º objeto, último objeto, n-ésimo objeto, etc.
Permite objetos repetidos
Noção de Lista Ligada Lista Ligada
Objeto 1
Objeto 2
Objeto 3
...
Objeto N
Lista
Nelson Freire (ISEP–DEI-PPROG 2012/13) 30/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 30/33
Constituída por sequência de nós
Nós interligados
Cada nó guarda
Um elemento (objeto) da lista // Java: tipo Object
Referência do próximo nó
Exemplo
Objeto 1
Lista
Objeto 2
Objeto3
Elemento
Próximo Nó
Objeto 1
Nó 2
Objeto 2
Nó 3
Nó 1 Cabeça
Objeto 3
null
Nó 3 Cauda
Nó 2
Nó 1 Nó 2 Nó 3 Nó 4
Cabeça da lista
Cauda da lista
Implementação de uma Lista Ligada Lista Ligada
Nelson Freire (ISEP–DEI-PPROG 2012/13) 31/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 31/33
Inserir objeto
Na cabeça da lista
Na cauda da lista
Na n-ésima posição
Remover objeto
Na cabeça
Na cauda
Na n-ésima posição
Procurar objeto
NOTA
Implementação da classe Lista Ligada é transparente para o utilizador dela
Utilizador não precisa de saber que objetos são guardados em nós
Métodos públicos só passam, por parâmetro, os objetos a armazenar
Nó 1 Nó 2 Nó 3 Nó 4
Cabeça da lista
Cauda da lista
Serviços Típicos de uma Lista Ligada Lista Ligada
Nelson Freire (ISEP–DEI-PPROG 2012/13) 32/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 32/33
public class TesteListaLigada {
public static void main(String[] args) {
ListaLigada veiculos = new ListaLigada();
Veiculo v1 = new Veiculo(“Nico”);
veiculos.inserirACabeca(v1);
Veiculo v2 = new Veiculo(“Toto”);
veiculos.inserirACabeca(v2);
....
cabeca
veículos
null
tamanho 0
nomeProp v1 Nico
cabeca veículos
Nó 1
tamanho 1
v1
null
Nó 1
nomeProp v2 Toto
cabeca veículos
Nó 2
tamanho 2
v2
Nó 1
Nó 2
v1
null
Nó 1
Exercício da Aula Prática Lista Ligada
Nelson Freire (ISEP–DEI-PPROG 2012/13) 33/33 Nelson Freire (ISEP–DEI-PPROG 2012/13) 33/33
public class TesteListaLigada {
public static void main(String[] args) {
...
veiculos.removerACabeca();
veiculos.removerACabeca();
....
}
}
Nó 1
cabeca veículos
null
tamanho 0
cabeca veículos
Nó 1
tamanho 1
v1
null
Exercício da Aula Prática Lista Ligada