You are on page 1of 6

5.

Generics, Iterators e Comparable em Java

Fernando Silva

DCC-FCUP

Estruturas de Dados

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 1 / 12

Tipos de Dados Abstractos Generics em Java

A partir do Java 5.0, passamos a ter uma base mais robusta e genrica
para lidar com tipos abstractos de dados sem que se tenha de recorrer a
castings explcitos.
Um tipo de dados genrico
um tipo de dados que no est definido em tempo de compilao, mas que
fica completamente especificado em tempo de execuo.

Vantagens:
permite a verificao de erros em tempo de compilao.
permite que se definam classes em termos de um conjunto de tipos
formais de parmetros, que podem ser usados para abstrair variveis
internas.
Exemplo: em vez de termos uma lista de inteiros, passar a ter uma
lista genrica em que o tipo de dados definido em tempo de
execuo.
Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 2 / 12
Object vs. Generics

Uma forma de definirmos classes com atributos que pudessem representar


qualquer objecto era fazendo uso do tipo de dados Object.
Por exemplo, fazendo uso das classes Node e LinkedList do captulo 4,
podemos ter:
LinkedList l= new LinkedList();
l.addFirst(new Integer(2));
Integer x= (Integer) l.get(0); // casting explcito
A ideia dos tipos genricos poder ter, por exemplo, uma definio de
lista genrica em que possa posteriormente explicitar qual o tipo particular
de dados que vai ter. Por exemplo:

LinkedList<Integer> l= new LinkedList<Integer>();


l.addFirst(new Integer(2));
Integer x= l.get(0);
Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 3 / 12

Exemplo de classe com tipos genricos


Para definir uma classe genrica, introduzimos parmetros genricos
usando letras como E, K, T, V.

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 4 / 12


Definio de uma fila genrica com listas ligadas (1)

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 5 / 12

Definio de uma fila genrica (2)

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 6 / 12


Iteradores

Um iterador
um padro (i.e. abstraco sobre mtodos existentes) que abstrai a noo
de percorrer uma sequncia de elementos, um de cada vez.

Um iterador encapsula os conceitos de elemento corrente e seguinte


numa coleco de objectos.
Um TAD-iterador inclui dois mtodos:
I hasNext() verifica se ainda existem elementos no iterador
I next() retorna o prximo elemento do iterador.
Uma classe para suportar iterao sobre uma sequncia de valores,
tem de incluir o mtodo
I iterator() retorna um iterador sobre elementos de um conjunto
I e a classe tem de especificar que iterable.
Podemos alargar as definies de Lista ligada, Pilha e Fila com
iteradores.
Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 7 / 12

Exemplo do uso de iteradores com listas ligadas

Vamos usar iteradores com a classe LinkedList do Java.


O programa guarda uma sequncia de nmeros na lista e depois percorre
essa sequncia com um iterador sobre os elementos da lista:

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 8 / 12


Ciclos for-each
Quando temos sequncias iterveis, podemos ter ciclos do tipo
for-each da forma:
for (TipoObj nomeVar : expresso)
bloco_instrues;
onde
I expresso corresponde a uma coleco de valores que implementa a
classe java.lang.Iterable.
I TipoObj tipo do objecto que o iterador retorna
I nomeVar nome da varivel que toma os valores retornados.
Exemplo:

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 9 / 12

Comparao de objectos

Objectos de tipos diferentes so comparados de modo diferente.


As Strings so comparadas lexicograficamente, por exemplo:
String a="abcd", b="abbc";
int cmp=a.compareTo(b);
if (cmp < 0)
System.out.println(a+" antes de "+b);
else if (cmp==0)
System.out.println(a+" igual "+b);
else
System.out.println(a+" depois de "+b);
E se tivermos dois objectos, por exemplo que representam alunos
onde consta o nome e a mdia, como compar-los?

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 10 / 12


Exemplo com comparable (1)
Consideremos a classe Aluno seguinte:

Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 11 / 12

Exemplo com comparable (2)


Para compararmos 2 objectos da classe Aluno, necessrio que esta
implemente o Comparable e defina um mtodo compareTo():

Ver outro exemplo no final do captulo de ordenao.


Fernando Silva (DCC-FCUP) 5. Generics, Iterators e Comparable em Java Estruturas de Dados 12 / 12

You might also like