Iterador
description
Transcript of Iterador
1
Iterador
ATAI
2
Introdução Desejamos criar uma classe para converter estrutura de
dados. Exemplo: copiar o conteúdo de uma estrutura linear para uma árvore ou vice-versa Cada estrutura de dados oferece interface e protocolo
diferentes para o acesso aos seus elementos
Algumas estruturas restringem o acesso aos seus elementos, como em Filas e Pilhas
Não é possível caminhar por seus elementos sem modificar as estruturas. (Como aceder o elemento do meio de uma pilha sem retirar os que estão sobre ele?)
Seria necessário ter acesso à implementação para “burlar” o protocolo de acesso
Isso quebra um dos pilares da OO: o encapsulamento
3
Objectivo
Proporcionar uma forma de aceder sequencialmente os elementos de um objecto agregado (uma colecção) sem expor sua representação interna.
Motivação Deseja-se isolar o uso de uma estrutura de dados da sua
representação interna. Isso permite mudar a estrutura sem afectar quem a utiliza. Às vezes é necessário permitir que mais de um cliente faça
o percurso da estrutura simultaneamente.
4
Como Percorrer uma Estrutura
Para determinadas estruturas, pode haver formas diferentes de percorrer e queremos encapsular a forma exacta de percorrer a estrutura.
Por exemplo: Uma fila pode ser percorrida nos sentidos frente=>fundo
ou fundo=>frente
Uma pilha pode ser percorrida do topo para a base e da da base para o topo
Pode ser necessário criar um “filtro" que só retorne certos elementos
5
Permissas do Iterator Um iterador deve ter um interface suficientemente
genérica e simples de forma que possa ser usado para percorrer todos os TADs
Criar o iterador: O iterador depende do TADs a ser percorrido, sendo
necessário que seja criado pelo mesmo Aplicabilidade
O padrão Iterator deve ser usado: Para aceder o conteúdo de um objecto agregado sem expor a
sua representação interna Para suportar múltiplas formas de varrimento Para proporcionar uma interface única para percorrer TADs
diferentes
6
Diagrama UML
Colecção<<Interface>>
getIterator()
Iterator<<Interface>>
hasNext():booleannext():Object
ColecçãoConcreta
getIterator():Iterator
IteradorConcreto
7
Diagrama UML: Actores Iterator
Define uma interface para aceder e percorrer os elementos IteradorConcreto
Implementa a interface Iterador Mantém a posição corrente (e qualquer outro estado) no
percurso do TAD Colecção
Define uma interface para criar um objecto Iterador ColecçãoConcreta
Implementa a interface que cria o Iterador para retornar o IteradorConcreto apropriado
8
Iterador
java.util.Iterator (5.0) suporta os seguintes métodos: boolean hasNext()
Retorna true se existirem mais elementos no Iterador.
Object next()Retorna o próximo elemento no Iterador.
void remove()- opcionalRemove o último elemento devolvido pelo Iterador
Podemos definir o nosso interface
public interface Iterator{
boolean hasNext();Object next();
}
9
Diagrama UML
Colecção<<Interface>>
getIterator()
Iterator<<Interface>>
hasNext():booleannext():Object
EstruturaLinear
getIterator():Iterator
EstruturaLinearIterator
10
Iterador numa Estrutura Linear EstáticaUso de classe localpublic class EstruturaLinearEstatica implements estruturaLinear {
private Object []tab;private int tamanho;
private class IteratorEst implements Iterator{int pos = 0;
public boolean hasNext(){ return (pos < tamanho ); } public Object next(){
return tab[pos++]; }
}
public Iterator getIterator() {return new IteratorEst ();
}//implementação de todos os métodos da Interface estruturaLinear }
11
Iterador numa Estrutura Linear DinâmicaUso de classe localpublic class EstruturaLinearDinamica implements estruturaLinear {
private No cabeca;private int tamanho;
private class ListaEncadeadaIterator implements Iterator {
No pos = cabeca;
public boolean hasNext(){ return (pos != null ); }
public Object next(){ Object cur = pos.getElemento();
pos = pos.getProximo(); return cur;
} }
public Iterator getIterator() {return new ListaEncadeadaIterator();
}
12
Iterador numa Estrura Linear
public static void main (String args[]){
Iterator ai, ai2;
EstruturaLinear s;
s = new EstruturaLinearDinamica ();
for( int i = 0; i < 10; i++ )
s.inserir( new Integer(i) );
ai = s.getIterator();
while (ai.hasNext()){
System.out.println("\n1 Iterador: "+ai.next());
System.out.print(" 2 Iterador:");
for (ai2 = s.getIterator(); ai2.hasNext();)
System.out.print(" "+ai2.next());
}
}
}