Coleções - Universidade Federal do Maranhãogeraldo/poo/6.1ColecoesAvancadas.pdf ·...
Transcript of Coleções - Universidade Federal do Maranhãogeraldo/poo/6.1ColecoesAvancadas.pdf ·...
Coleções Avançadas
Programação Orientada a Objetos Java
Prof. Anselmo Cardoso Paiva
Prof. Geraldo Braz Junior
Objetivos Aprender como o conceito de coleção
pode ser expresso de forma genérica
Examinar a interface de três tipos diferentes de coleções:◦ Listas◦ Conjuntos◦ Mapas
Apresentar a finalidade de cada uma das interfaces chave e saber que coleção selecionar com base em um determinado requisito
2
Motivação Saber trabalhar bem com coleções é um
requisito fundamental para qualquer programador, pois objetos possuem relacionamentos entre si
As coleções apresentam uma excelente implementação dos conceitos de orientação a objetos o que permitem que elas seja altamente reutilizáveis e fáceis de usar
3
O que são coleções? São estruturas de dados que fornecem um
conjunto bem definido de classes e interfaces do pacote java.util que agregam grupos de objetos como unidade simples (listas, conjuntos e mapas)
A coleção é, em si, um objeto também
4
O que são coleções? São estruturas de dados comuns:
Vetores, Listas, Conjuntos, Pilhas, Árvores binárias, Tabelas Hash
As coleções não armazenam tipos primitivos. Para manipulá-los é necessário envolvê-los nas classes empacotadoras (wrappers – Integer, Double, ...)
5
Coleções As Coleções são compostas de três partes:
Interfaces: Possibilitam manipular as coleções independentes de sua implementação fornecendo uma interface uniforme
Implementações: São classes concretas que implementam as interfaces. No geral, são estruturas de dados reutilizáveis
Algoritmos: métodos reutilizáveis para buscar, classificar e remover objetos em uma coleção
6
Tipos de Coleções Dependendo da forma de fazer as 4 quatro
operações básicas (adição, remoção, acesso e pesquisa), temos vários tipos de coleções, onde:
Certas operações poderão ter um desempenho melhor ou pior
Certas operações poderão ter restrições ou funcionalidade especial
7
Tipos de Coleções Existem dois tipos de coleções em Java: as
que implementam a Interface Collection e os mapas, que implementam Map
A interface Collection possui duas subinterfaces:◦ List – representa uma lista de itens◦ Set – representa um conjunto (os itens não
podem se repetir)
A interface Map implementa uma tabela Hash - compostos de chaves + valor◦ SortMap - mapa ordenado
8
Tipos de Coleções
9
Interface Collection Fornece dois métodos fundamentais
boolean add(Object obj) retorna true se a inclusão alterou a coleção
Exemplo: ao tentar incluir um objeto em um conjunto (Set) , se o objeto já existir será retornado false, pois conjuntos não aceitam valores duplicados
Iterator iterator() retorna um objeto que implementa a interface
Iterator que pode ser utilizado para percorrer os objetos na coleção
10
Interface Iterator Encapsula a navegação dos elementos de
uma coleção. Suporta acesso unidirecional e a remoção do objeto corrente
Esta interface fornece três métodos fundamentais Object next()
boolean hasNext()
void remove()
11
Interface Iterator Com o método next() é possível examinar
os elementos da coleção. Entretanto se for atingido o fim da coleção, será lançado uma exceção “não verificada” NoSuchElementException
Deve-se chamar o método hasNext() para resolver este problema
Por que o método remove() faz parte da interface Iterator ?
Por motivo de eficiência, pois permite eliminar um objeto – recuperado através do método next() – ao examiná-lo
12
Interface Iterator É inválido chamar remove() se ele não for
precedido de uma chamada a next(). Caso tente fazer isto será lançado um IllegalStateException
Exemplo: eliminando o primeiro elemento
Iterator it = c.iterator();
it.next(); //recupera o primeiro elemento
it.remove(); //agora, remove-o
13
Outros métodos de Collection int size()
retorna o tamanho da coleção
boolean isEmpty()
indica se a coleção está vazia ou não
boolean remove(Object obj)
retorna true se o objeto passado como parâmetro foi removido, false caso contrário
14
Outros métodos de Collection boolean addAll(Collection outro)
faz a união de duas coleções
15
Outros métodos de Collection boolean removeAll(Collection outra)
remove todos os elementos dessa coleção que são iguais aos elementos da outra coleção Parâmetro: outra – indica os elementos a serem removidos
Só retorna falso se não for removido nenhum elemento
16
Outros métodos de Collection
17
Outros métodos de Collection boolean retainAll(Collection outra)
remove todos os elementos dessa coleção que não são iguais a um dos elementos da outra coleção
Parâmetro: outra – indica os elementos a serem mantidos
18
Outros métodos de Collection void clear()
Apaga todo o conteúdo da coleção
Object [] toArray()
retorna um array dos objetos da coleção
19
Características das Coleções Pode ser armazenado qualquer objeto na
coleção
Não aceitam tipos primitivos (mas podem ser empacotados utilizando uma classe wrapper)
20
Características das Coleções
21
Solução para o problema anterior
Utilizar o padrão de projeto “Delegação”
22
Collections utilizando Generics (Java 5)
Collection<E>
O parâmetro E parametriza o tipo de elemento armazenado na coleção
23
A Hierarquia de classes para coleções
24
A Hierarquia de classes para Mapas
Mapa é um tipo especial de coleção que armazena pares de objetos (chave + valor)
25
Classes que implementam ListArrayList, LinkedList, Vector
List Uma lista é uma coleção de elementos
dispostos numa ordem linear, onde cada elemento tem um antecessor (exceto o primeiro) e um sucessor (exceto o último)
Normalmente implementada como "Array" (Vector, ArrayList) ou "Lista Encadeada" (LinkList)
Todas as três implementações são ordenadas (pode-se visitar todos os elementos em uma ordem não aleatória)
Uma Lista pode ser mantida classificada ou não
27
Listas Operações mais importantes de uma
coleção do tipo Lista:
Adicionar um elemento em qualquer lugar da lista, fornecendo o índice desejado add(int indice, Object obj)
28
Listas Remover um elemento presente em
qualquer lugar da lista, fornecendo o índice desejado
Object remove(int indice)
Caso o índice seja inválido será lançada uma exceção do tipo IndexOutOfBoundsException
29
Listas Acesso aos elementos
Obter o elemento de qualquer posição da lista, fornecendo o índice desejado Object get(int indice)
Iterar sobre os elementos Iterator iterator()
Pesquisa de elementos
Descobrir o índice de um elemento na lista int indexOf(Object o)
Obter o número de elementos da coleção int size()
30
A classe ArrayList Escolha natural quando for necessário usar
um vetor redimensionável
Implementado internamente com vetores
Dar suporte a acesso aleatório rápido
Esta lista é ideal quando precisar de interações rápida e não pretender executar muitas inserções e remoções
31
ArrayList - Exemplo
32
LinkedList Implementa uma lista duplamente
encadeada
Fornece novos métodos (além dos obtidos na interface List) para implementar pilhas ou filas
void addFirst(Object o)
void addLast(Object o)
Object getFirst( )
Object getLast( )
33
LinkedList Muito mais eficiente que ArrayList para
remoção einserção no meio da lista, onde apenas o encadeamento em torno do elemento precisa ser atualizado
Também é ideal para acesso seqüencial
34
LinkedList
35
LinkedList Quando se deseja inserir em uma posição
especifica da lista precisamos de um iterador. O problema é que a interface Iterador não fornece um método add()
Solução: É fornecida na sub interface ListIterator que contém o método add()
Ao contrario de add em Collection esse método não retorna um valor boolean, pressupõem que a operação sempre tem sucesso
36
LinkedList
37
Classes que implementam Conjunto HashSet, LinkedSet e TreeSet
Conjuntos Dá importância a exclusividade
Um conjunto é uma coleção que não possui elementos duplicados
O método equals() determina se dois objetos são iguais
Não há noção de "ordem dos elementos"
O Conjunto pode ser mantido ordenado ou não
Normalmente implementada como "Tabela Hash” (HashSet, LinkedHashSet, TreeSet)
39
Conjuntos Operações mais importantes de uma
coleção do tipo Conjunto:
Adição de elementos (descartando duplicações) boolean add(Object): só adiciona o elemento se
ele já não estiver presente (usa equals() para saber se o objeto é o mesmo)
Remoção de elementos Remover um objeto presente no conjunto
Acesso aos elementos Iterar sobre os elementos
Pesquisa de elementos
Descobrir se um certo elemento está na coleção40
Conjuntos Indagar sobre atributos
Obter o número de elementos
Como se vê, as operações são semelhantes, embora diferentes, daquelas para uma Lista
41
HashSet É um conjunto não-ordenado e não-
classificado baseado em uma tabela Hash
Quando utilizar ?
Quando quiser um conjunto sem duplicatas e não for necessário uma ordem na interação
42
Tabelas Hash É uma das melhores maneiras de
armazenar informações para pesquisa rápida
Armazena informações utilizando um cálculo especial no objeto para escolher a localização na tabela para armazená-lo
Para recuperar a informação utiliza-se o mesmo cálculo
43
HashSet - Construtores HashSet( )
Cria uma tabela hash com 101 depósitos e com um fator de carga 0,75
HashSet(int capacidadeIncial)
Constrói um conjunto hash com a capacidade especificada
HashSet(Collection elementos)
Constrói um conjunto de hash e inclui todos os elemetos de uma coleção
44
HashSet - Construtores HashSet(int capacidadeInicial, float
fatorCarga)
Constrói um conjunto hash com a capacidade e o fator de carga especificados.
45
HashSet Utiliza o código de hash do objeto que
estar sendo inserido por meio do método hashCode()
O método hashCode() é definido na classe Object◦ Portanto, todo objeto tem um código de
hash padrão
Classes Strings e Wrapper (Integer, Double, ...) redefinem equals() e se tornam adequadas para serem utilizadas como chave em HashSet e TreeSet
46
TreeSet É semelhante ao conjunto classificado
Garante que os elementos fiquem em ordem crescente de acordo com a sua ordem natural
Construtores
TreeSet() Constrói uma árvore vazia
TreeSet(Collection elementos) Constrói uma árvore e inclui todos os elementos de
uma coleção
47
TreeSet
48
Comparação Comparação de Objetos Como comparar um objeto qualquer???
Como TreeSet sabe a ordem que você deseja ???◦ Resposta: o TreeSet assume que foi
implementado a interface Comparable
Várias classes da plataforma Java implementam a interface Comparable. Exemplo: String
49
Comparação Comparação de Objetos
Para comparar os seus objetos é preciso implementar a interface Comparable, pois não existe uma implementação padrão em Object
Para implementar o método int compareTo() da interface Comparable, retorne:
Um inteiro menor que zero se objeto atual for “menor” que o recebido como parâmetro
Um inteiro maior que zero se objeto atual for “maior” que o recebido como parâmetro
Zero se objetos forem iguais50
Exemplo
51
Exemplo
52
Classes que implementam a interface MapHashMap, TreeMap, HashTable
Interface Map Coleção que usa objetos para indexar
objetos (chave valor)
Tanto a chave quanto o valor são objetos
Chaves são unívocas (Set)
Valores podem ser duplicados (Collection)
54
Interface Map A chave é utilizada para inserir, remover e
achar um elemento rapidamente
As operações serão baseadas no código hashda chave através da invocação do método hashCode()
Em relação às chaves O Mapa pode ser mantido ordenado (TreeMap) ou não (HashMap)
55
Interface Map – principais métodos
Object put(Object key, Object value)
associa uma chave a um valor no mapa. Se a chave já estiver presente o novo valor substitui o anterior e retorna o valor antigo ou null, caso a chave não esteja presente
corresponde ao método add(Object obj) de Collection
Object get(Object key)
recupera um objeto associado a uma chave ou null caso a chave não exista
56
Interface Map – principais métodos Set keySet()
◦ retorna um conjunto com todas as chaves do mapa. Podemos remover elementos desse conjunto e o valor removido e suas chaves serão removidos do mapa, mas não é possível incluir
Collection values()◦ retorna uma Collection com todos os
valores do mapa. Pode-se remover elementos desse conjunto e o valor removido e suas chaves serão removidos do mapa, mas não é possível incluir
57
Interface Map – principais métodos
Set entrySet()
retorna um conjunto de pares chave-valor contendo objetos representados pela interface interna Map.Entry. Pode-se remover elementos desse conjunto e o valor removido e suas chaves serão removidos do mapa, mas não é possível incluir
58
public static interface Map.Entry
Interface interna usada para manter pares chavevalor em qualquer implementação de Map
Principais métodos:
Object getKey() - retorna a chave
Object getValue() - retorna o valor dessa entrada
59
public static interface Map.Entry
60
HashMap Fornece um conjunto Map não-ordenado e
não-classificado
Quando se precisar de um mapa e não estiver preocupado com a ordem (na interação), então HashMap é a melhor opção. TreeMap e LinkedHashMap adicionam um pouco mais de sobrecarga
61
HashMap Construtores
HashMap()
HashMap(Map entradas)
HashMap(int CapacidadeInicial)
HashMap(int CapacidadeInicial, float fatorCarga)
62
HashMap
63
HashMap
64
HashMap
65
Outra alternativa as coleções do J2SE
Commons Collections, do projeto Apache Jakarta
Define coleções que são utilizadas por inúmeros softwares do grupo Apache (commons-collections.jar)
66