5. Generics, Iterators e Comparable em Java

Propaganda
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 genérica
para lidar com tipos abstractos de dados sem que se tenha de recorrer a
“castings” explícitos.
Um tipo de dados genérico é
um tipo de dados que não está definido em tempo de compilação, mas que
fica completamente especificado em tempo de execução.
Vantagens:
permite a verificação de erros em tempo de compilação.
permite que se definam classes em termos de um conjunto de tipos
formais de parâmetros, que podem ser usados para abstrair variáveis
internas.
Exemplo: em vez de termos uma lista de inteiros, passar a ter uma
lista genérica em que o tipo de dados é definido em tempo de
execução.
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 capítulo 4,
podemos ter:
LinkedList l= new LinkedList();
l.addFirst(new Integer(2));
Integer x= (Integer) l.get(0); // casting explícito
A ideia dos tipos genéricos é poder ter, por exemplo, uma definição de
lista genérica 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 genéricos
Para definir uma classe genérica, introduzimos parâmetros genéricos
usando letras como E, K, T, V.
Fernando Silva (DCC-FCUP)
5. Generics, Iterators e Comparable em Java
Estruturas de Dados
4 / 12
Definição de uma fila genérica com listas ligadas (1)
Fernando Silva (DCC-FCUP)
5. Generics, Iterators e Comparable em Java
Estruturas de Dados
5 / 12
Definição de uma fila genérica (2)
Fernando Silva (DCC-FCUP)
5. Generics, Iterators e Comparable em Java
Estruturas de Dados
6 / 12
Iteradores
Um iterador é
um padrão (i.e. abstracção sobre métodos existentes) que abstrai a noção
de percorrer uma sequência de elementos, um de cada vez.
Um iterador encapsula os conceitos de elemento corrente e seguinte
numa colecção de objectos.
Um TAD-iterador inclui dois métodos:
I
I
hasNext() – verifica se ainda existem elementos no iterador
next() – retorna o próximo elemento do iterador.
Uma classe para suportar iteração sobre uma sequência de valores,
tem de incluir o método
I
I
iterator() – retorna um iterador sobre elementos de um conjunto
e a classe tem de especificar que é iterable.
Podemos alargar as definições 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 sequência de números na lista e depois percorre
essa sequência 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 sequências iteráveis, podemos ter ciclos do tipo
for-each da forma:
for (TipoObj nomeVar : expressão)
bloco_instruções;
onde
I
I
I
expressão – corresponde a uma colecção de valores que implementa a
classe java.lang.Iterable.
TipoObj – tipo do objecto que o iterador retorna
nomeVar – nome da variável que toma os valores retornados.
Exemplo:
Fernando Silva (DCC-FCUP)
5. Generics, Iterators e Comparable em Java
Estruturas de Dados
9 / 12
Comparação de objectos
Objectos de tipos diferentes são comparados de modo diferente.
As Strings são 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 média, 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, é necessário que esta
implemente o Comparable e defina um método compareTo():
Ver outro exemplo no final do capítulo de ordenação.
Fernando Silva (DCC-FCUP)
5. Generics, Iterators e Comparable em Java
Estruturas de Dados
12 / 12
Download