java collections-basic

36

Click here to load reader

Upload: jose-f-rodrigues-jr

Post on 26-May-2015

171 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Java collections-basic

http://publicationslist.org/junio

Java CollectionsProf. Jose Fernando Rodrigues Junior

http://www.icmc.usp.br/[email protected]

INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP -

SCC0504 - Programação Orientada a Objetos

Page 2: Java collections-basic

http://publicationslist.org/junio

Introdução Set (conjunto): composição elementos sem repetição e sem

ordem definida. Exemplo: A = {banana, maçã, abacate}

Multiset (multi-conjunto): composição de elementospossivelmente com repetição e sem ordem definida.Exemplo: A = {banana, maçã, abacate, banana}Também denominado: list (lista), grupo (bunch), bag (saco, sacola),

heap (monte), sample (amostra), suite (jogo de) e collection(coleção)

Sequência: conjunto de elementos cuja ordem importa.Exemplo: {banana, maçã, abacate} ≠ {maçã, banana, abacate}

Page 3: Java collections-basic

http://publicationslist.org/junio

Introdução Set (conjunto): composição elementos sem repetição e sem

ordem definida. Exemplo: A = {banana, maçã, abacate}

Multiset (multi-conjunto): composição de elementospossivelmente com repetição e sem ordem definida.Exemplo: A = {banana, maçã, abacate, banana}Também denominado: list (lista), grupo (bunch), bag (saco sacola),

heap (monte), sample (amostra), suite (jogo de) e collection(coleção)

Sequência: conjunto de elementos cuja ordem importa.Exemplo: {banana, maçã, abacate} ≠ {maçã, banana, abacate}

Em computação, pela própria definição baseada namáquina de Turing, conjuntos e multiconjuntospossuem alguma ordem – pois estão em memória.Essa ordem pode ser considerada (definindo-se umasequência) ou não.

Page 4: Java collections-basic

http://publicationslist.org/junio

Introdução Conjuntos, multiconjuntos e sequências são

alguns dos principais conceitos de toda amatemática, ciência da computação e mesmocognição humana

Tratam-se de conceitos abstratos (em contraste aconceitos concretos, como um carro por exemplo)

Em muitos contextos, por praticidade, o termoCollection se refere de maneira geral a conjuntos,multiconjuntos e sequências (ordered collections)

Page 5: Java collections-basic

http://publicationslist.org/junio

Collections básicas

Page 6: Java collections-basic

http://publicationslist.org/junio

A interface Collection Collections em Java começam pela interface de

mesmo nome – e são genéricas!public interface Collection<E> extends Iterable<E> {

// Basic operationsint size();boolean isEmpty();boolean contains(Object element);boolean add(E element); //optionalboolean remove(Object element); //optionalIterator<E> iterator();

// Bulk operationsboolean containsAll(Collection<?> c);boolean addAll(Collection<? extends E> c); //optionalboolean removeAll(Collection<?> c); //optionalboolean retainAll(Collection<?> c); //optionalvoid clear(); //optional

// Array operationsObject[] toArray();<T> T[] toArray(T[] a);

}

As operações da interfaceCollection são as operaçõescomuns a conjuntos, multi-conjuntos e sequências.

Page 7: Java collections-basic

http://publicationslist.org/junio

Iteradores A idéia de coleções que se baseiam em uma interface raíz

e que são genéricas traz dois problemas:1) a maneira como se percorre os elementos da coleção;

por exemplo, percorrer um ArrayList (por índice) édiferente de se percorrer um LinkedList (porencadeamento)

2) não se sabe com antescedência qual o tipoarmazenado na coleção, portanto, ponteiros earitmética de ponteiros não é possível

Solução: iteradores Iteradores abstraem como e o quê está sendo percorrido

em uma coleção, permitindo a escrita de código maisgeral (que possui por baixo código mais específico)

Page 8: Java collections-basic

http://publicationslist.org/junio

Iteradores A idéia de coleções que se baseiam em uma interface raíz

e que são genéricas traz dois problemas:1) a maneira como se percorre os elementos da coleção;

por exemplo, percorrer um ArrayList (por índice) édiferente de se percorrer um LinkedList (porencadeamento)

2) não se sabe com antescedência qual o tipoarmazenado na coleção, portanto, ponteiros earitmética de ponteiros não é possível

Solução: iteradores Iteradores abstraem como e o quê está sendo percorrido

em uma coleção, permitindo a escrita de código maisgeral (que possui por baixo código mais específico)

A solução é ter a interface Iterable<E> comosuperinterface da interface Collection <E>:

interface Collection <E> extends Iterable<E>

O quê requer os seguintes métodos:• boolean hasNext();• E next();• void remove();

Page 9: Java collections-basic

http://publicationslist.org/junio

IteradoresA interface Iterator <E>: boolean hasNext()

Returns true if the iteration has more elements. E next()

Returns the next element in the iteration. void remove()

Removes from the underlying collection the last elementreturned by the iterator (optional operation).

Esses três métodos devem ser implementados para sedefinir o iterador de uma coleção genérica. Mas jáestão disponíveis em um monte de coleções do Java.

Page 10: Java collections-basic

http://publicationslist.org/junio

Arrays e listas dinâmicas Arrays (arranjos) e linked lists (listas

encadeadas) são as estruturas mais usadas paraproblemas de collections – elas permitem que setenha conjuntos, multiconjuntos e sequênciasem memória

Exemplo NetBeans ListTest Quando usar ArrayList e quando usar LinkedList?

ArrayList: quando se têm muito acesso aleatório (acessosnão sequenciais), o que é eficiente por meio de índice dearray abstraído pelo iterador, e pouca edição (add e remove)

LinkedList: quando se tem muita edição (add e remove) eacesso sequencial dos elementos da lista

Page 11: Java collections-basic

http://publicationslist.org/junio

Arrays e listas dinâmicas Alguns collections muito conhecidos são as

estruturas de dados Pilha e Fila Qual é a relação entre arrays, linked lists, pilhas e

filas? Arrays e linked lists são apenas conjuntos de dados (ou

coleções) Pilhas e filas são conjuntos (ou coleções) com restrições

de acesso Portanto:

Um array pode ser uma pilha ou uma fila Um linked list pode ser uma pilha ou uma fila Tanto arrays como linked lists são listas (ou conjuntos, ou coleções) Um array não pode ser um linked list, e vice versa Uma pilha não pode ser uma fila, e vice versa Todos são coleções

Page 12: Java collections-basic

http://publicationslist.org/junio

Arrays e listas dinâmicas Alguns collections muito conhecidos são as

estruturas de dados Pilha e Fila Qual é a relação entre arrays, linked lists, pilhas e

filas? Arrays e linked lists são apenas conjuntos de dados (ou

coleções) Pilhas e filas são conjuntos (ou coleções) com restrições

de acesso Portanto:

Um array pode ser uma pilha ou uma fila Um linked list pode ser uma pilha ou uma fila Tanto arrays como linked lists são listas (ou conjuntos, ou coleções) Um array não pode ser um linked list, e vice versa Uma pilha não pode ser uma fila, e vice versa Todos são coleções

Estes e outros fatos se refletem na definição e no uso das coleções do Java.

Page 13: Java collections-basic

http://publicationslist.org/junio

Queue (Fila) Fila: trata-se de uma coleção na qual a entrada só

ocorre de um lado e a saída só ocorre do ladooposto – FIFO, portanto

FilaEntradaSaída

Page 14: Java collections-basic

http://publicationslist.org/junio

Stack (Pilha) Pilha: uma coleção na qual a entrada e a saída

só ocorrem do mesmo lado – LIFO, portanto

PilhaEntrada

Saída

Page 15: Java collections-basic

http://publicationslist.org/junio

ArrayDeque Array que aceita operações de inserção e

remoção em ambas as extremidades

Portanto, um ArrayDeque pode ser: uma fila sobre um array: métodos add e remove uma pilha sobre um array: métodos push e pop

Exemplo NetBeans QueueStackArrayTest

DequeEntrada

Saída

Entrada

Saída

Page 16: Java collections-basic

http://publicationslist.org/junio

LiskedList Da mesma maneira, um linked list aceita

naturalmente operações de adição e remoção emambas as extremidades

Portanto, uma LinkedList pode ser: uma fila sobre uma lista encadeada: métodos add e

remove uma pilha sobre sobre uma lista encadeada: métodos

push e pop

Exemplo NetBeans QueueStackLinkedListTest

Page 17: Java collections-basic

http://publicationslist.org/junio

LiskedList Da mesma maneira, um linked list aceita

naturalmente operações de adição e remoção emambas as extremidades

Portanto, uma LinledList pode ser: uma fila sobre uma lista encadeada: métodos add e

remove uma pilha sobre sobre uma lista encadeada: métodos

push e pop

Exemplo NetBeans

As diferentes possibilidades de implementação dependem dascaracterísticas de cada aplicação. A documentação da classeArrayDeque adverte que:

“This class is likely to be faster than Stack when used as a stack,and faster than LinkedList when used as a queue.”(http://download.oracle.com/javase/6/docs/api/)

Já a mais específica classe Stack adverte que:“A more complete and consistent set of LIFO stack operationsis provided by the Deque interface and its implementations,which should be used in preference to this class.”(http://download.oracle.com/javase/6/docs/api/)

Outras soluções da API: vector, arrays, stack, diversas variações dequeue e de lista, entre outras.

Page 18: Java collections-basic

http://publicationslist.org/junio

Sorting Como já mencionado em outra aula, a ordenação de coleções (listas)

depende da definição de uma relação de ordem total entre seuselementos

Isso é possível usando-se a interface Comparable:

public interface Comparable<T> {public int compareTo(T o);

}

Uma vez implementada, pode-se ordenar uma dada coleçãochamando-se o método estático

public static void sort(List<T> list)

Page 19: Java collections-basic

http://publicationslist.org/junio

Sorting Os tipos primitivos do Java implementam a interface Comparable em

suas respectivas classes de boxing.

Page 20: Java collections-basic

http://publicationslist.org/junio

Sorting Suponha o seguinte problema: você está usando objetos de uma

classe da qual você não tem acesso ao código fonte, e estaclasse não implementa a interface Comparable ou implementadiferentemente do que você deseja.

Se você quiser ordenar uma lista com os objetos desta classe, comofazer? Para este problema, o Java oferece uma alternativa, a interface Comparator

public interface Comparator<T> {int compare(T o1, T o2);

}

Torna-se possível a definição de comparadores de objetos aoinvés de objetos que são comparáveis entre si.

public static void sort(List<T> list, Comparator<T> c)

Exemplo NetBeans ComparatorTest e ListTest

Page 21: Java collections-basic

http://publicationslist.org/junio

Até aquiListas (“conjuntos” COM repetição)

e SEM restrições (acesso e remoção em posições aleatórias)

• Array: ArrayList<E>

• Lista encadeada: LinkedList<E>

Listas (“conjuntos” COM repetição)e COM restrições (acesso e remoção

apenas nas extremidades)

• Array: ArrayDeque

• Lista encadeada: LinkedList<E>

• class Stack<E>: pilha• interface Queue<E>: fila

• Pilha: push/pop• Fila: add/remove

• Pilha: push/pop• Fila: add/remove

Sets (conjuntos SEM repetição) Próximos slides

Page 22: Java collections-basic

http://publicationslist.org/junio

Sets

Page 23: Java collections-basic

http://publicationslist.org/junio

Set A interface Set descende de Collection

public interface Set<E> extends Collection<E>

Trata-se de um conjunto, matematicamente falando, semrepetição e sem ordem

Interface base para coleções que NÃO permitem repetição de elementos Não pode haver dois elementos e1 e e2 tais que e1.equals(e2) Não pode haver dois elementos com valor null

Page 24: Java collections-basic

http://publicationslist.org/junio

Implementações de Set Existem três implementações diferentes, todas servem para o mesmo fim,

mas com desempenho e requisitos diferentes: HashSet: usa um hash para oferecer tempo constante, idealmente O(1),

para operações (add, remove, contains e size); requer que equals ehashCode sejam sobreescritos – não mantém nenhuma ordem, melhordesempenho

LinkedHashSet: semelhante ao HashSet, usa também uma listaencadeada para manter a ordem dos elementos de acordo com a ordemde entrada

TreeSet: requer que a interface Comparable seja implementada –ordena pelo valor dos elementos mantendo-os em uma árvore bináriade busca (não usa hash) – pior desempenho, mas provê ordenaçãosimplificada

Como o HashSet evita repetições?Caso dois elementos possuam o mesmo código hash, prossegue para

a comparação com o método equals. Portanto, deve-sesobreescrever tanto o método equals quanto o hashCode

Exemplo NetBeans SetTest

Page 25: Java collections-basic

http://publicationslist.org/junio

Até aquiListas (“conjuntos” COM repetição)

e SEM restrições (acesso e remoção em posições aleatórias)

• Array: ArrayList<E>

• Lista encadeada: LinkedList<E>

Listas (“conjuntos” COM repetição)e COM restrições (acesso e remoção

apenas nas extremidades)

• Array: ArrayDeque

• Lista encadeada: LinkedList<E>

• class Stack<E>: pilha• interface Queue<E>: fila

• Pilha: push/pop• Fila: add/remove

• Pilha: push/pop• Fila: add/remove

Sets (conjuntos SEM repetição)• HashSet• LinkedHashSet• TreeSet

Page 26: Java collections-basic

http://publicationslist.org/junio

Maps

Page 27: Java collections-basic

http://publicationslist.org/junio

Map Map é um conceito amplamente usado em ciência da computação, refere-se

ao mapeamento entre chaves e valores

Map é uma parte do arcabouço de coleções, mas que não descende deCollection, mas sim da interface Map

public interface Map<K,V>

Modela o conceito matemático de função, isto é: as chaves não possuem repetição uma dada chave mapeia exatamente um valor

Page 28: Java collections-basic

http://publicationslist.org/junio

Map A interfacepublic interface Map<K,V> {

// Basic operationsV put(K key, V value);V get(Object key);V remove(Object key);boolean containsKey(Object key);boolean containsValue(Object value);

...

// Collection Viewspublic Set<K> keySet(); //as chaves sem repetição, determinam um conjuntopublic Collection<V> values(); //já os valores, determinam apenas uma coleção

...}

Page 29: Java collections-basic

http://publicationslist.org/junio

Até aquiListas (“conjuntos” COM repetição)

e SEM restrições (acesso e remoção em posições aleatórias)

• Array: ArrayList<E>

• Lista encadeada: LinkedList<E>

Listas (“conjuntos” COM repetição)e COM restrições (acesso e remoção

apenas nas extremidades)

• Array: ArrayDeque

• Lista encadeada: LinkedList<E>

• class Stack<E>: pilha• interface Queue<E>: fila

• Pilha: push/pop• Fila: add/remove

• Pilha: push/pop• Fila: add/remove

Sets (conjuntos SEM repetição)• HashSet• LinkedHashSet• TreeSet

Mapas (definem o conceito matemático de função*)

• HashMap• LinkedHashMap• TreeMap

*com a diferença de que o contra-domínio (valores) não é necessariamente um conjunto

Page 30: Java collections-basic

http://publicationslist.org/junio

Até aquiListas (“conjuntos” COM repetição)

e SEM restrições (acesso e remoção em posições aleatórias)

• Array: ArrayList<E>

• Lista encadeada: LinkedList<E>

Listas (“conjuntos” COM repetição)e COM restrições (acesso e remoção

apenas nas extremidades)

• Array: ArrayDeque

• Lista encadeada: LinkedList<E>

• class Stack<E>: pilha• interface Queue<E>: fila

• Pilha: push/pop• Fila: add/remove

• Pilha: push/pop• Fila: add/remove

Sets (conjuntos SEM repetição)• HashSet• LinkedHashSet• TreeSet

Mapas (definem o conceito matemático de função*)

• HashMap• LinkedHashMap• TreeMap

*com a diferença de que o contra-domínio (valores) não é necessariamente um conjunto

Os sets podem ser considerados casos especiais de maps nos quais o valor mapeado por uma chave é o próprio valor da chave.

Page 31: Java collections-basic

http://publicationslist.org/junio

Implementações de Map Assim como Set, possui três implementações diferentes:

HashMap, LinkedHashMap e TreeMap

Estas implementações possuem as mesmas implicações que as de Set.

Exemplo NetBeans MapsTest

Page 32: Java collections-basic

http://publicationslist.org/junio

Wildcards – coleção de alguma coisa

Page 33: Java collections-basic

http://publicationslist.org/junio

Wildcards Suponha o seguinte problema: você possui uma hierarquia de classes

Pessoa/ \

Aluno Professor

Você possui coleções ArrayList tanto de Alunos quanto de Professores E você deseja escrever um método que imprime o conteúdo destas

coleções, seja lá qual o seu conteúdo Pode-se pensar na seguinte solução

public void printCollection(ArrayList<Pessoa> umaColecao){for(Pessoa o : umaColecao)

System.out.println(o.getNome());}

Funciona?

Page 34: Java collections-basic

http://publicationslist.org/junio

Wildcards Resposta: não funciona Apesar da hierarquia de classes, para o compilador não há relação

nenhuma entre as diferentes definições:

ArrayList<Pessoa> ≠ ArrayList<Aluno> ≠ ArrayList<Professor>

Desta maneira, o método só compila se receber exatamente umArrayList<Pessoa>

Como proceder então? Usar WildCard

O código ficaria então:public void printCollection(ArrayList<?> umaColecao){

for(Pessoa o : umaColecao)System.out.println(o.getNome());

}

Page 35: Java collections-basic

http://publicationslist.org/junio

Wildcards O código ficaria então:

public void printCollection(ArrayList<?> umaColecao){for(Pessoa o : umaColecao)

System.out.println(o.getNome());}

Ok, mas e se alguém passasse alguma coisa quenão é Pessoa? Por exemplo, ArrayList<Double>? Haveria problema de execução, pois Double não possui

um método getNome Solução, limitar o wildcard; ficaria assim:

public void printCollection(ArrayList<? extends Pessoa> umaColecao){for(Pessoa o : umaColecao)

System.out.println(o.getNome());}

Seriam aceitos ArrayList<Pessoa>, ArrayList<Aluno> e ArrayList<Professor>

Page 36: Java collections-basic

http://publicationslist.org/junio

Wildcards Solução, limitar o wildcard, ficaria assim:

public void printCollection(ArrayList<? extends Pessoa> umaColecao){for(Pessoa o : umaColecao)

System.out.println(o.getNome());}

Seriam aceitos ArrayList<Pessoa>, ArrayList<Aluno> e ArrayList<Professor> “? extends” é denominado upper bound wildcard

Mas, e se por alguma razão fosse desejado que apenasProfessor e Pessoa pudessem ser aceitos? A solução poderia ficar assim

public void printCollection(ArrayList<? super Professor> umaColecao){for(Pessoa o : umaColecao)

System.out.println(o.getNome());}

Seriam aceitos ArrayList<Professor>, ArrayList<Pessoa> “? super” é denominado lower bound wildcard