Você está na página 1de 52

Instituto de Educao Superior da Paraba

LP3: Java Collection Framework

Prof. Msc. Gustavo Svio de Oliveira


<saviojp@gmail.com>

Collections
A API do Collections fornece diversas
classes que representam estruturas de
dados avanadas.

Collections
Possui 3 grandes tipos de coleo
Lista (java.util.List)

Conjunto (java.util.Set)

Mapa (java.util.Map)

Collections

Collections
Operaes:
Adio

Remoo

Acesso

Pesquisa e indagar sobre atributos

Etc
5

Collections

Collections
J temos o Array do Java...Qual seria
a vantagem de utilizarmos colees?

Collections
Redimensionamento de array?
Buscar um elemento sem conhecer o
ndice?
Etc?

Collections
Lista (java.util.List)
Uma coleo de elementos em
ordem linear.

Cada elemento tem um antecessor


(exceto o primeiro) e um sucessor
(exceto o ltimo)
9

Collections
Lista (java.util.List)
A Lista pode ser mantida ordenada
ou no

Permite elementos duplicados

10

Collections
Classes mais utilizadas da Interface List

11

Collections
ArrayList - Instanciao
import java.util.ArrayList;
public class App {
public static void main(String[] args) {
ArrayList lista = new ArrayList();
lista.add("Joo");
lista.add("Maria");
lista.add("Jos");

Qualquer objeto
pode ser
adicionado

for (int i = 0; i < lista.size(); i++) {


System.out.println(lista.get(i));
}
}
}

12

Collections
ArrayList - Instanciao
public static void main(String[] args) {
Aluno aluno = new Aluno("Jos");
Disciplina disciplina = new Disciplina("Java");
ArrayList lista = new ArrayList();
lista.add(aluno);
lista.add(disciplina);
for (int i = 0; i < lista.size(); i++) {
if (lista.get(i) instanceof Aluno) {
Necessrio
Aluno a = (Aluno) lista.get(i);
um cast
System.out.println(a.getNome());
} else if (lista.get(i) instanceof Disciplina) {
Disciplina d = (Disciplina) lista.get(i);
System.out.println(d.getDisciplina());
}
}
}

efetuar

13

Collections
ArrayList Polimorfismo e Generics
public static void main(String[] args) {
Aluno aluno = new Aluno("Jos");
List<Aluno> lista = new ArrayList<Aluno>();
lista.add(aluno);
for (Aluno a : lista) {
System.out.println(a.getNome());
}
}

14

Collections
ArrayList Ordenao
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add("Jos");
lista.add("Maria");
lista.add("Antnio");
Collections.sort(lista);
for (String nome : lista) {
System.out.println(nome);
}
}

Ordenando as Strings
- String implementa
Comparable, ou seja,
A classe String j
implementou qual
seria o critrio de
ordenao

15

Collections
ArrayList Ordenao de Aluno
E se quisermos efetuar uma
ordenao de Alunos por ordem
alfabtica?
java.lang.Comparable
public interface Comparable<T> {
int compareTo(T objeto);
}

16

Collections
ArrayList Ordenao de Aluno
public class Aluno implements Comparable<Aluno> {
private String nome;
public Aluno(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
public int compareTo(Aluno o) {
return (this.nome.toLowerCase().
compareTo(o.getNome().toLowerCase()));
}
}

17

Collections
ArrayList Ordenao de Aluno
public static void main(String[] args) {
Aluno aluno = new Aluno("Jos");
Aluno aluno2 = new Aluno("Adriano");
Aluno aluno3 = new Aluno("Bruno");
List<Aluno> lista = new ArrayList<Aluno>();
lista.add(aluno);
lista.add(aluno2);
lista.add(aluno3);
Collections.sort(lista);
for (Aluno a : lista) {
System.out.println(a.getNome());
}
}

18

Collections
ArrayList Ordenao de Aluno
E se quisermos efetuar uma
ordenao de Alunos por numero de
matrcula tambm?

19

Collections
ArrayList Ordenao de Aluno
J implementamos Comparable...no
podemos mais utiliz-lo. E no
queremos perder a comparao por
nome tambm...

20

Collections
ArrayList Ordenao de Aluno
Java.util.Comparator
public interface Comparator<T> {
int compare(T o1, T o2);
}

21

Collections
public class Aluno implements Comparable<Aluno>, Comparator<Aluno> {
private String nome;
private int matricula;
public Aluno() {
}
// Outros mtodos da classe aluno foram omitidos
public int compare(Aluno a1, Aluno a2) {
if (a1.getMatricula() > a2.getMatricula()) {
return 1;
Retorna 1 se o objeto comparador for maior
}
if (a1.getMatricula() < a2.getMatricula()) {
return -1;
Retorna -1 se o objeto comparador for menor
}
return 0;
}

Retorna 0 se o objeto comparador for igual

}
22

Collections
ArrayList Ordenao de Aluno
Como Collection.sort saberia qual
critrio seguir?
Ordenar alfabeticamente ou;

Ordenar pela matricula?


23

Collections
public static void main(String[] args) {
Aluno aluno = new Aluno("Jos", 1234);
Aluno aluno2 = new Aluno("Adriano", 5436);
Aluno aluno3 = new Aluno("Bruno", 11);
List<Aluno> lista = new ArrayList<Aluno>();
lista.add(aluno);
lista.add(aluno2);
lista.add(aluno3);

Existe um mtodo sort


sobrecarregado que recebe
como argumento um
comparator, que nesse caso o
objeto aluno.

Collections.sort(lista, new Aluno());


for (Aluno a : lista) {
System.out.println(a.getNome());
}
}

24

Collections
ArrayList Ordenao de Aluno
E se eu quiser adicionar mais um
critrio de ordenao...
J implementamos Comparable e
Comparator...ficamos sem opo?
25

Collections
public static void main(String[] args) {
Aluno aluno = new Aluno("Gustavo Svio");
Aluno aluno2 = new Aluno("Vegeta");
Aluno aluno3 = new Aluno("Goku");
List<Aluno> lista = new ArrayList<Aluno>();
lista.add(aluno);
lista.add(aluno2);
lista.add(aluno3);
Collections.sort(lista, new Comparator<Aluno>() {
public int compare(Aluno o1, Aluno o2) {
if (o1.getNome().length() > o2.getNome().length()) {
return 1;
}
if (o1.getNome().length() < o2.getNome().length()) {
return -1;
}
return 0;
}
});
for (Aluno a : lista) {
System.out.println(a.getNome());
}
}

26

Collections
Ento...Quando devo implementar
Comparable e Comparator?

27

Collections
Comparable deve ser utilizada para
definir uma ordenao natural do
objeto (ordenao default) e ...
Comparator sempre que tivermos a
necessidade
de
fazermos
uma
ordenao diferente...
28

Collections
ArrayList - Removendo um objeto
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add("Gustavo");
lista.add("Svio");
lista.remove("Gustavo");
for (String nome : lista) {
System.out.println(nome);
}
}
29

Collections
ArrayList Verificando se um objeto
existe
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add("Gustavo");
lista.add("Svio");
if (lista.contains("Gustavo")) {
System.out.println("Existe");
}
}
30

Collections
ArrayList Percorrendo com Iterator
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add("Gustavo");
lista.add("Svio");
Iterator<String> it = lista.iterator();
while (it.hasNext()) {
String nome = (String) it.next();
System.out.println(nome);
}
}
31

Collections
Quando devo usar ArrayList e/ou
LinkedList ou Vector?
Use ArrayList se acessar por ndice
for comum (ex. pesquisa binria)
Use LinkedList se inserir ou remover
elementos do meio com frequncia
32

Collections
Vector bastante semelhante ao
ArrayList, mas ele gera um overhead
maior: seus mtodos so syncronized.

33

Collections

34

Collections
Set (java.util.Set)
Uma coleo de elementos
semelhante a um conjunto da
matemtica.

35

Collections
A ordem em que os elementos so
armazenados podem no ser a ordem
em que eles foram inseridos no
conjunto.
A interface Set no define esse
comportamento,
isso
varia
de
implementao.
36

Collections
No existem elementos duplicados
em um Set

37

Collections
HashSet implementado com uma
tabela hash. Elementos no so
ordenados.
TreeSet implementado com uma
rvore. Os elementos so ordenados.

38

Collections
LinkedHashSet um meio termo
entre
HashSet
e
TreeSet.

implementa com um hash table com


uma linked, assim mantendo a ordem
de insero.

39

Collections
Instanciao HashSet
public static void main(String[] args) {
Set<Integer> numeros = new HashSet<Integer>();
numeros.add(100);
numeros.add(30);
numeros.add(1);
numeros.add(25);
numeros.add(9);
numeros.add(25); // repetido!

No ser inserido

for (Integer n: numeros) {


System.out.println(n.toString());
}
}

40

Collections
Instanciao TreeSet
public static void main(String[] args) {
Set<Integer> numeros = new TreeSet<Integer>();
numeros.add(100);
numeros.add(30);
numeros.add(1);
numeros.add(25);
numeros.add(9);
numeros.add(25); // repetido!

No ser inserido

for (Integer n: numeros) {


System.out.println(n.toString());
}
}

41

Collections
Instanciao TreeSet
Toda classe que usa um TreeSet precisa implementar Comparable
public class Aula {
private int qtdAlunos;

public static void main(String[] args) {


Set<Aula> conjunto = new TreeSet<Aula>();

public Aula(int qtdAlunos) {


this.qtdAlunos = qtdAlunos;
}

conjunto.add(new Aula(10));
conjunto.add(new Aula(4));
conjunto.add(new Aula(1));

public int getQtdAlunos() {


return this.qtdAlunos;
}

for (Aula a: conjunto) {


System.out.println(a.getQtdAlunos());
}
}

Exception in thread "main" java.lang.ClassCastException: br.com.iesp.collection.Aula cannot be cast to


java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)

42

Collections
Instanciao TreeSet
public class Aula implements Comparable<Aula> {
private int qtdAlunos;
public Aula(int qtdAlunos) {
this.qtdAlunos = qtdAlunos;
}
public int getQtdAlunos() {
return this.qtdAlunos;
}
public int compareTo(Aula o) {
if (this.qtdAlunos > o.getQtdAlunos()) {
return 1;
}
if (this.qtdAlunos < o.getQtdAlunos()) {
return -1;
}
return 0;
}
}

43

Collections
Instanciao LinkedHashSet
public static void main(String[] args) {
Set<Aula> conjunto = new LinkedHashSet<Aula>();
conjunto.add(new Aula(10));
conjunto.add(new Aula(4));
conjunto.add(new Aula(1));
for (Aula a: conjunto) {
System.out.println(a.getQtdAlunos());
}
}

44

Collections
Desempenho
TreeSet possui o pior desempenho
por ser ordenado

HashSet e LinkedHashSet
geralmente possuem desempenho
bem prximos.
45

Collections
Map (java.util.Map)
composto por um conjunto de
associaes chave valor

equivalente ao conceito de
dicionrio

46

Collections
Map (java.util.Map)
HashMap No ordenado

TreeMap Ordenado pela chave

LinkedHashMap Preserva a
ordem de insero

HashTable Semelhante ao
HashMap com a exceo que
sincronizado

47

Collections
Instanciao HashMap
public static void main(String[] args) {
Map<String, Aula> mapa = new HashMap<String, Aula>();
mapa.put("Turma A", new Aula(10));
mapa.put("Turma H", new Aula(4));
mapa.put("Turma E", new Aula(1));
for (Entry<String, Aula> entry : mapa.entrySet()) {
System.out.println(entry.getKey().toString() + " - " +
entry.getValue().getQtdAlunos());
}
}
HashMap no permite a adio de dois elementos idnticos
equals e hashCode

48

Collections
Instanciao TreeMap
public static void main(String[] args) {
Map<String, Aula> mapa = new TreeMap<String, Aula>();
mapa.put("Turma A", new Aula(10));
mapa.put("Turma H", new Aula(4));
mapa.put("Turma E", new Aula(1));
for (Entry<String, Aula> entry : mapa.entrySet()) {
System.out.println(entry.getKey().toString() + " - " +
entry.getValue().getQtdAlunos());
}
}
Um objeto para ser chave precisa implementar comparable,
visto que TreeMap ordena pela chave!

49

Collections
Instanciao LinkedHashMap
public static void main(String[] args) {
Map<String, Aula> mapa = new LinkedHashMap<String, Aula>();
mapa.put("Turma A", new Aula(10));
mapa.put("Turma H", new Aula(4));
mapa.put("Turma E", new Aula(1));
for (Entry<String, Aula> entry : mapa.entrySet()) {
System.out.println(entry.getKey().toString() + " - " +
entry.getValue().getQtdAlunos());
}
}
LinkedHashMap preserva a posio de insero dos
elementos!

50

Referncias
http://docs.oracle.com/javase/7/docs/a
pi/java/util/List.html
http://docs.oracle.com/javase/7/docs/api
/java/util/Set.html
http://docs.oracle.com/javase/7/docs/a
pi/java/util/Map.html
51

Referncias
http://www.caelum.com.br/apostilajava-orientacao-objetos
http://www.dsc.ufcg.edu.br/~jacques/c
ursos/p2/html/ed/colecoes.htm
http://www.programcreek.com/2013/03
/arraylist-vs-linkedlist-vs-vector/
52