Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Professor: Hyggo Almeida
Iterator Professor: Hyggo Almeida
2
Iterator Utilização de estruturas de dados
Vector, ArrayList, HashSet, ... public void classeXusando(Vector col){...} Vector collection; public void classeWusando(ArrayList col){...} ArrayList collection; public void classeZusando(HashSet col){...} HashSet collection;
3
Eu quiser a mudar a estrutura de dados??
E se... Eu quiser a mudar a estrutura de dados?? HashSet!!! public void classeXusando(Vector col){...} Vector collection; Vector!!! public void classeWusando(ArrayList col){...} ArrayList collection; public void classeZusando(HashSet col){...} HashSet collection;
4
Iterator Problema Solução
Como isolar o uso de uma estrutura de dados de sua representação interna de forma a poder mudar a estrutura sem afetar quem a usa??? Para determinadas estruturas, pode haver formas diferentes de “varredura”. Como encapsular a forma exata de varredura??? Solução Usar um Iterador!!! A idéia do iterador é retirar da coleção a responsabilidade de acessar e varrer a estrutura colocar a responsabilidade num novo objeto separado chamado iterador
5
Iterator A classe Iterador Implementa a interface Iterator
Mantém qualquer informação de estado necessária para saber até onde a iteração (varredura) já foi (mantém o cursor) Como criar um iterador? Não se pode usar new diretamente pois o iterador a ser criado depende da coleção a ser varrida Solução: a coleção tem um factory method para criar um iterador Exemplo em java: Vector.iterator()
6
Iterator Iterador do Vector public Iterator iterator() {
return new Iterator() { // classe interna anônima int cursor = 0; public boolean hasNext() { return cursor < size(); } public Object next() { try { Object next = get(cursor); cursor++; return next; } catch(IndexOutOfBoundsException e) { throw new NoSuchElementException(); } }; Decorator e Iterator
7
Iterator Como funciona??? Cliente Iterador(cursor) Estrutura de dados
Estrutura de dados Iterador(cursor) 1 “João” Iterador(cursor) 2 Varredura crescente 1 “Maria” Iterador(cursor) 3 Vector 2 “Carlos” Iterador(cursor) 4 3 “Paulo” Iterador(cursor) 5 hasNext() = false 4 “José” Iterador(cursor) 6 5 “João” Decorator e Iterator
8
Iterator Posso mudar a forma de varrer!!! Sem mudar a estrutura!
Cliente Iterador(cursor) Estrutura de dados “João” Iterador(cursor) 1 Varredura pares!!! 1 “Maria” Vector 2 “Carlos” Iterador(cursor) 2 3 “Paulo” hasNext() = false 4 “José” Iterador(cursor) 3 5 “João”
9
Iterator Posso mudar a estrutura sem mudar a forma de varrer! Cliente
Iterador(cursor) “João” Iterador(cursor) 1 Varredura pares!!! 1 “Maria” HashSet 2 “Carlos” Iterador(cursor) 2 3 “Paulo” hasNext() = false “João” 4 “José” Iterador(cursor) 3
10
Iterator Aplicabilidade Também chamado de Conseqüências
É possível acessar a coleção de objetos sem saber a fonte dos objetos Aplicabilidade Uma classe necessita acessar o conteúdo de uma coleção sem se tornar dependente da classe que implementa aquela coleção Uma classe necessita de uma maneira uniforme de acessar o conteúdo de múltiplas coleções Também chamado de Cursor Decorator e Iterator
11
Iterator Vamos implementar um EvenIterator para retornar apenas os índices pares de uma coleção de MyNumber’s e um OddIterator para os índices ímpares. Use a interface java.util.Iterator Use classes internas Cliente printNumbers(Iterator); NumCollection MyNumber evenIterator():Iterator; oddIterator():Iterator; iterator():Iterator; numbers: Vector; addNumber(myNumber); evenIterator():Iterator; oddIterator():Iterator; iterator():Iterator; value:int; toString(); Decorator e Iterator
12
Iterator Mão na massa!!! Pares Cliente.main Cliente.printNumbers
return new Iterator(){ int cursor = 0; public void remove() { numbers.remove(cursor); } public boolean hasNext() { return (cursor < numbers.size()); public Object next() { try { Object next = numbers.get(cursor); cursor+=2; return next; } catch(IndexOutOfBoundsException e) { throw new NoSuchElementException(); }; Pares Cliente.main NumCollection col = new NumCollection(); col.addNumber(new MyNumber(0)); col.addNumber(new MyNumber(1)); col.addNumber(new MyNumber(2)); col.addNumber(new MyNumber(3)); printNumbers(col.evenIterator()); Cliente.printNumbers private static void printNumbers(Iterator iterator) { while (iterator.hasNext()) { System.out.println(iterator.next()); } Decorator e Iterator
13
Dúvidas? ? Decorator e Iterator
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.