Iterador
description
Transcript of Iterador
![Page 1: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/1.jpg)
1
Iterador
ATAI
![Page 2: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/2.jpg)
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
![Page 3: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/3.jpg)
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.
![Page 4: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/4.jpg)
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
![Page 5: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/5.jpg)
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
![Page 6: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/6.jpg)
6
Diagrama UML
Colecção<<Interface>>
getIterator()
Iterator<<Interface>>
hasNext():booleannext():Object
ColecçãoConcreta
getIterator():Iterator
IteradorConcreto
![Page 7: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/7.jpg)
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
![Page 8: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/8.jpg)
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();
}
![Page 9: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/9.jpg)
9
Diagrama UML
Colecção<<Interface>>
getIterator()
Iterator<<Interface>>
hasNext():booleannext():Object
EstruturaLinear
getIterator():Iterator
EstruturaLinearIterator
![Page 10: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/10.jpg)
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 }
![Page 11: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/11.jpg)
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();
}
![Page 12: Iterador](https://reader036.fdocumentos.com/reader036/viewer/2022082821/5681512f550346895dbf4832/html5/thumbnails/12.jpg)
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());
}
}
}