Sei sulla pagina 1di 20

Iteradores

Fac. Cincias Univ. Lisboa

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Hoje
!

Iteradores e sua utilizao.


Ciclos for-each.
! Interface Iterator e interface Iterable .
!

! As classes coleco da biblioteca Java.


!

Escrita de um iterador para listas.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iteradores
!

Imaginemos que queremos processar todos os


elementos de uma lista (ex. LinkedList)

Podemos comear num index 0 e acessar um por um:

for (int index = 0; index < umaLista.size(); index++) {


E proxElemento = umaLista.get(index);
// processar o elemento
...
}"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Eficincia
! Se assumirmos que o mtodo get comea no primeiro

n da lista (head) , haver em cada chamada a get


um ciclo como este:
Node nodeRef = head;"
for (int j = 0; j< index; j++) {
nodeRef = nodeRef.next;
}"

! Este ciclo executado index vezes. Como index

varia de 0 a umaLista.size()-1, o tempo total


de execuo proporcional a umaLista.size()2,
ou seja, O(n2).
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iterator = acesso sequencial


! O iterador uma espcie de marcador que regista e mantm

actualizada a posio corrente de uma dada lista ligada.


! O programador pode usar o mtodo next do Iterator

do objecto para avanar para o prximo item, onde espera


que seja necessrio outra vez.
!

Cada vez que se usa um objecto o Iterator avana para o


prximo item e espera.

Tambm se pode determinar se existe um prximo item na


lista: mtodo hasNext.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iterator excepes
! O Iterator lana uma excepo

NoSuchElementException se se tentar aceder ao


prximo elemento depois de todos os elementos terem
sido processados.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Exemplo:
! //assumindo iter declarado como

// Iterator de uma LinkedList myList


while (iter.hasNext()) {
E nextElement = iter.next();
// processa
...
}"
! Este fragmento O(n) em vez de O(n2)
! Agora vamos ver como se declara iter como

Iterator do LinkedList myList"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

A interface Iterator
!

A interface Iterator<E> definida como parte do package


API java.util.

Os mtodos:
!
!
!

boolean hasNext() Returns true if the iteration has more


elements.
E next() Returns the next element in the iteration. If there
are no more elements throws NoSuchElementException.
void remove() Removes from the underlying collection the
last element returned by the iterator (optional operation).

A interface List (em geral, todas as classes que implementam a


interface Collection) declara o mtodo iterator, que
devolve um objecto Iterator que percorre os elementos dessa
lista.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Exemplo de uso Iterator


!

No ciclo seguinte, processamos todos os itens de List<Integer> atravs


de um Iterator:"

Iterator<Integer> itr = aList.interator();


while (itr.hasNext()) {
int value = itr.next();
//processa
...
}"

Um Iterator no referncia ou apontador para um objecto particular.


Devemos pensar nele como apontando para entre os objectos.

Para usar o remove temos que antes chamar sempre o next. (caso
contrrio d IllegalStateException)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Ciclos For Each


! A instruo for-each simplifica o uso de iteradores
! Ex: contar o nmero de vezes que target ocorre em

myList:

! count = 0;

for (String nextStr: myList) {


if (target.equals(nextStr)) {
count++;"
! Este for melhorado cria um objecto Iterator e

implicitamente chama os seus mtodos hasNext e


next"
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

For Each: outros exemplos


!

Somar todos os inteiros de uma lista


! sum = 0;

for (int nextInt: aList)


sum += nextInt;"
!

Imprimir todos os caracteres de um char []

! for (char nextCh: charArray)

System.out.print(nextCh);
System.out.println();"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

For Each: definio


! FORMA:

for (parametroFormal: expresso)


{...}"
! SIGNIFICADO:
! Durante cada repetio do ciclo, a varivel especificada

por parmetroFormal acessa o prximo elemento da


expresso, comeando pelo primeiro elemento e
terminando no ltimo. A expresso tem que ser um
array ou uma colleco que implemente a interface
Iterable.
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

A interface Iterable
! A interface Iterable apenas exige que uma classe

que a implemente fornea um mtodo iterator.

! A interface Collection extende a interface

Iterable de forma a que todas as classes que


implementam a interface List (uma subclasse de
Collection) forneam um mtodo iterator.
! public interface Iterable<E>{

//devolve um iterador sobre os


//elementos desta coleco
Iterator <E> iterator();
}
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

As classes Collection

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Collections
!

ArrayList e LinkedList so coleces de objectos que


podem ser referenciados por um ndice.

! Na interface Collection podemos ter coleces de

quaisquer tipo
! A interface Collection especifica um sub-conjunto dos

mtodos da interface List:


NO ESTO: "
add(int, E); get(int); remove(int); set(int, E)"
"
ESTO:"
add(E); remove(E); iterator(); size(); contains(E)"
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Caractersticas comuns
! As Collections crescem medida das necessidades
! As Collections mantm referncias aos objectos
! As Collections tm pelo menos dois construtores: um

para criar uma Collection vazia e outro para fazer uma


cpia de outra Collection

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Detalhes
!

Nas Collections que implementam a interface List, a


ordem do iterator determinada pelo ndice dos
elementos. Em geral a ordem no especificada.

Nos ArrayList e LinkedList, o mtodo add(E) insere


sempre o elemento no fim e retorna true. Em geral, a
posio da insero no especificada.

! A interface Set estende a Collection exigindo que

o add no insira um objecto que j est presente, em


vez disso, no caso contrrio devolve false.
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iterator class para listas

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iterator class para listas

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Iterator class para listas

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Potrebbero piacerti anche