Buscar

Introdução às Coleções em Java

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 47 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 47 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 47 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Coleções
Prof. Marcelo Roberto Zorzan
Profa. Rachel Reis
Aula de Hoje
• Coleções
Introdução
• Coleções podem representar estruturas de dados
complexas de forma transparente para o
programador.
• Exemplos:
• Músicas favoritas armazenadas no computador
• Jogadores de um time
• Com as coleções os programadores utilizam
estruturas de dados existentes sem se preocupar
como elas são implementadas.
Visão Geral
Queue
• Collection: interface-raiz na hierarquia de coleções a partir da qual as 
interfaces Set e List são derivadas.
• Set : uma coleção que não contém duplicatas
• List : uma coleção ordenada que pode conter elementos duplicados
• Map: associa chaves a valores e não pode conter chaves duplicadas
• Queue: modela uma fila de espera.
Queue
Situação - Problema
� (Set ou List?)
1) Faça um programa em Java que contenha:
a) uma classe Pessoa com os atributos nome e idade.
b) uma classe Principal que imprima as informações das b) uma classe Principal que imprima as informações das 
pessoas cadastradas. 
Coleções
� Implementa uma estrutura de dados que armazena 
qualquer tipo de objeto.
� Não aceita tipos primitivos como elementos, apenas � Não aceita tipos primitivos como elementos, apenas 
instâncias de objetos. 
� Para guardar tipos primitivos devemos usar as 
classes wrapper. (Integer, Double, Float, etc)
� Declarado no pacote java.util
Classes Wrapper
� Permite a utilização de tipos primitivos como objetos.
Bytebyte
Booleanboolean
Doubledouble
Floatfloat
Longlong
Integerint
Shortshort
Characterchar
Bytebyte
Interface Collection 
Visão Geral
<<interface>> 
<<interface>> 
Collection
<<interface>> 
<<interface>> 
List
ArrayList VectorLinkedList
<<interface>> 
SortedSet
HashSet
<<interface>> 
Set
TreeSet
Interface List
� Uma List é uma Collection ordenada que pode conter 
elementos duplicados.
� Como os arrays, o índice do primeiro elemento de uma 
List é zero.
� A interface List é implementada por várias classes, 
incluindo as classes Vector, ArrayList e LinkedList.
<<interface>> 
Collection
Interface List
<<interface>> 
List
ArrayList VectorLinkedList
Interface List
Interface Classes Operações Nome do Método 
(Interface List)
Adição add(int index, Object elem)
List ArrayList
LinkedList
Adição add(int index, Object elem)
Remoção remove(int index)
Acesso get(int index)
listIterator()
Pesquisa indexOf(Object elem)
Tipos genéricos
• Tipos genéricos trazem a facilidade de parametrizar
o tipo de classes, variáveis ou métodos.
• Na API do JDK 5.0 todas as collection foram• Na API do JDK 5.0 todas as collection foram
parametrizadas.
// Java 1.4:
List lista = new ArrayList();
Tipos genéricos
lista.add(“Luis”);
String nome = (String) lista.get(0);
// Java 1.5 – usando generics:
List<String> lista = new ArrayList<String>();
lista.add(“Luis”);
String nome = lista.get(0);
Tipos genéricos
Outro exemplo
// Java 1.4:
List lista2 = new ArrayList();
lista2.add(new Pessoa(“José", 11));
JOptionPane.showMessageDialog(null, lista2.get(0)); JOptionPane.showMessageDialog(null, lista2.get(0)); 
[método getNome() não disponível!]
// Java 1.5 – usando generics:
List<Pessoa> lista2 = new ArrayList<Pessoa>();
lista2.add(new Pessoa(“José", 11));
JOptionPane.showMessageDialog(null, lista2.get(0).getNome());
ArrayList
� É um estrutura de dados que tem com base 
um array
� Principais características:
ArrayList
� Principais características:
� Acesso sequencial/aleatório extremamente rápido.
� Em função do índice o acesso a um elemento no meio da lista é 
uma operação extremamente rápida.
� Inserção é também extremamente rápida.
� Pode ser redimensionada dinamicamente.
� A classe ArrayList não é uma lista de arrays, apesar do 
nome é uma lista de objetos.
ArrayList - operações
� Criar um objeto ArrayList
�Instancie um objeto da classe ArrayList, usando o 
construtor com ou sem parâmetro
ArrayList<T> a = new ArrayList<T>();
ArrayList<T> b = new ArrayList<T>(20);
�O tamanho retornado por ambos objetos com o método 
size() vai ser zero, pois não adicionamos nenhum objeto 
nas listas
�Contudo, o valor 20 que foi informado significa a 
capacidade inicial da lista
• Adicionar elementos a um ArrayList
�O método add() pode ou não receber como parâmetro a 
posição na lista que desejamos que ele ocupe.
ArrayList - operações
posição na lista que desejamos que ele ocupe.
�Caso a posição que informarmos já possua um objeto, o 
mesmo será deslocado uma posição para frente e o nosso 
objeto será colocado na posição solicitada.
�A vantagem de não informar a posição é que a própria lista 
vai cuidar de gerenciar a posição do objeto
Pessoa p = new Pessoa(“joao”, 19);
ArrayList<Pessoa> a = new ArrayList<Pessoa>();
a.add(p);
ArrayList - operações
ou 
a.add(0, p); // Adicionou o objeto p na posição zero do ArrayList
• Remover elementos de um ArrayList
� Para remover um item da lista basta informar a posição da lista 
que desejamos remover
ArrayList - operações
a.remove(int i);
• Ler os dados do ArrayList
� Para ler dados da lista podemos usar o método get()
Pessoa p1 = a.get(int i);
Cuidado !!!
Ao usar o método add(...), get() ou remove() o elemento da 
lista deve existir, caso contrário irá gerar um exceção : 
ArrayList - operações
lista deve existir, caso contrário irá gerar um exceção : 
java.lang.IndexOutOfBoundsException
• Usando o Iterator para percorrer uma lista
� Um iterator serve para recuperar os elementos de uma coleção
ArrayList - operações
� Um iterator serve para recuperar os elementos de uma coleção
Iterator i = a.iterator();
while (i.hasNext()) 
{
Pessoa pessoa = (Pessoa) i.next();
JOptionPane.showMessageDialog(null,pessoa.getNome());
}
� Desta forma percorremos a lista, sem saber o tamanho da mesma. 
Atenção!!!
� Se uma coleção for modificada por um dos seus
métodos depois de um iterador ser criado para essa
ArrayList - operações
métodos depois de um iterador ser criado para essa
coleção, o iterador se torna imediatamente inválido.
�Qualquer operação realizada com o iterador depois
desse ponto pode lançar uma exceção
java.util.ConcurrentModificationException
LinkedList
� A classe LinkedList trabalha com o conceito
de lista encadeada.
LinkedList
� Além de implementar a interface List, a classe LinkedList provê
métodos uniformemente nomeados para get, remove e insert um
elemento no início e no final de uma lista. Essas operações
permitem que as listas encadeadas sejam utilizadas como pilha ou
fila
� Essa classe permite que sejam adicionados elementos no início ou
no final da lista.
LinkedList - operações
• Criar um objeto LinkedList:
LinkedList<String> lista = new 
LinkedList<String>();
• Adicionar um elemento (objeto) no final da lista:
lista.add(objeto);
lista.addLast(objeto);
•Adicionar um elemento (objeto) no início da lista:
lista.addFirst(objeto);
• Retornar o tamanho (número de elementos) da lista:
lista.size();
• Recuperar o elemento (objeto) na posição i:
objeto = lista.get(int i);
• Recuperar o primeiro elemento (objeto):
objeto = lista.getFirst();
• Recuperar o último elemento (objeto):
LinkedList - operações
• Recuperar o último elemento (objeto):
objeto = lista.getLast();
• Remover o elemento (objeto) da posição i:
lista.remove(int i);
• Remover o primeiro elemento (objeto):
lista.removeFirst();
• Remover o último elemento (objeto):
lista.removeLast();
Vector
• Como ArrayList, a classe Vector fornece as 
capacidades das estruturas de dados no estilo array 
que podem se redimensionar dinamicamente.
Vector
que podem se redimensionar dinamicamente.
• A diferença entre eles (ArrayList e Vector) é que a 
classe Vector garante sincronização de dados.
LinkedList x ArrayList
• As diferenças são basicamente relativas a inserção,
remoção e iteração.
• A LinkedList é a mais rápida para inserção e iteração. Se• A LinkedList é a mais rápida para inserção e iteração. Se
a lista for apenas para inserir e exibir os elementos (sem
remover ou alterar) LinkedListé melhor.
• ArrayList é melhor se você precisa de acesso com índice
(chamado acesso aleatório) ou seja , quando você usa o
lista.get(i)
Interface Set
• Um set é uma Collection que não contém elementos 
duplicados.
<<interface>> TreeSet:
<<interface>> 
SortedSet
HashSet
Set
TreeSet
� Modela conjuntos ordenados.
� Armazena seus elementos em uma
árvore.
HashSet:
�Modela conjuntos não ordenados.
�Armazena seus elementos em uma
tabela Hash.
• A interface Set é uma extensão de Collection que não
acrescenta nenhum método à especificação básica.
Interface Set
Collection
containsAll(Object)
addAll(Object)
retainAll(Object)
remove(Object)
• Operações
- Subconjunto (containsAll)
- União (addAll)
- Interseção (retainAll)
- Diferença (removeAll)
Interface SortedSet
• A interface SortedSet é uma extensão de Set que agrega
o conceito de ordenação ao conjunto.
• Operações adicionais são fornecidas para tirar proveito
dessa ordenação:
- comparator()
- first()
- headSet (Object toElement) 
- last() 
- subSet (Object fromElement, Object toElement)
- tailSet(Object fromElement)
HashSet x TreeSet
• Essa estrutura de coleções contém diversas implementações 
de Set, incluindo as classes HashSet ou TreeSet.
• Ao contrário de arrays não é necessário especificar a posição 
para adicionar um elemento, basta fazer:para adicionar um elemento, basta fazer:
c.add(objeto)
• Outros métodos são:
- add - adiciona um elemento ou um conjunto de elementos. 
- remove - remove um elemento ou um conjunto de elementos.
- contains - Retorna true se o conjunto possuir algum elemento. 
- isEmpty - Retorna true se o conjunto estiver vazio. 
• Os elementos de um Set não tem uma ordem como em um 
array, em que o primeiro elemento está na posição 0
HashSet x TreeSet
• A classe HashSet não possui ordem específica
• Já a classe TreeSet cria uma ordem, no caso de• Já a classe TreeSet cria uma ordem, no caso de
números do menor para o maior e no caso de String a
ordem é lexicográfica.
Exemplo 1 HashSet
import java.util.*;
public class ExemploHashSet {
public static void main(String[] args) {
Collection <String> c = new HashSet <String>();Collection <String> c = new HashSet <String>();
c.add("Maria");
c.add("Joao");
c.add("Ana");
c.add("Joao");
c.add("Jose");
System.out.println(c);
}
}
Qual o resultado?
• Resultado: [Joao, Jose, Maria, Ana]
• No exemplo anterior temos um nome que é
Exemplo 1 HashSet
• No exemplo anterior temos um nome que é
adicionado duas vezes, mas como a interface Set não
permite repetição quando manipulamos Strings, ele na
verdade só é inserido uma vez.
• Observe que não há uma ordem na impressão dos
resultados.
import java.util.*;
public class ExemploHashSet2 {
public static void main(String[] args) {
Collection <String> c = new HashSet <String>();
c.add("Maria");
Exemplo 2 HashSet
c.add("Maria");
c.add("Joao");
c.add("Ana");
c.add("Joao");
c.add("Jose");
Iterator i = c.iterator();
while( i.hasNext() ) {
System.out.print( i.next() + " " );
}
}
}
Resultado: 
Joao Jose Maria Ana
Exemplo 1 TreeSet
import java.util.*;
public class ExemploTreeSet {
public static void main(String[] args) {
Collection<String> c = new TreeSet<String>();
c.add("Maria");c.add("Maria");
c.add("Joao");
c.add("Ana");
c.add("Joao");
c.add("Jose");
Iterator i = c.iterator();
while( i.hasNext() ) {
System.out.print( i.next() + " " );
}
}
} Qual o resultado?
• Resultado é : Ana Joao Jose Maria
• Observe que não é permitido repetições, como em um
HashSet, e que neste caso os elementos já estão
Exemplo 1 TreeSet
HashSet, e que neste caso os elementos já estão
ordenados.
Exemplo 2 TreeSet
import java.util.*;
public class ExemploTreeSet2 {
public static void escreve(Collection d) {
Iterator i = d.iterator();
while( i.hasNext() ) {
System.out.print( i.next() + " " );
}
}
...
public static void main(String[] args) {
Collection <String> c = new TreeSet <String>();
Collection <String> c2 = new TreeSet <String>();
Exemplo 2 TreeSet
c.add("Maria");
c.add("Joao");
c.add("Ana");
c.add("Joao");
c.add("Jose");
c.add("Andre");
System.out.println(“Elementos de c ");
escreve( c );
...
Iterator j = c.iterator();
while( j.hasNext() ) {
Object o = j.next();
if( o.equals("Jose") ) {
Exemplo 2 TreeSet
if( o.equals("Jose") ) {
j.remove();
}
}
System.out.println(“Elementos de c menos Jose ");
escreve( c );
c.remove("Andre");
System.out.println(“Elementos de c menos Andre ");
escreve( c );
...
...
c2.add("Claudia");
c2.add("Paulo");
c2.add("Ana");
System.out.println(“Elementos de c2 ");
Exemplo 2 TreeSet
System.out.println(“Elementos de c2 ");
escreve( c2 );
c.addAll(c2);
System.out.println(“Elementos de c união c2 ");
escreve( c );
c.removeAll(c2);
System.out.println(“Elementos de c menos c2 ");
escreve( c );
}
}
Resultado – Exemplo 2 
>Elementos de c
>Ana Andre Joao Jose Maria
>Elementos de c menos Jose
>Ana Andre Joao Maria>Ana Andre Joao Maria
>Elementos de c menos Andre
>Ana Joao Maria
>Elementos de c2 
>Ana Claudia Paulo
>Elementos de c união c2 
>Ana Claudia Joao Maria Paulo
>Elementos de c menos c2 
>Joao Maria
Exemplo 3 TreeSet
• Agora vamos ver um exemplo usando um TreeSet com
elementos do conjunto que possuem mais de um campo.
• Nestes exemplos os elementos são funcionários de uma• Nestes exemplos os elementos são funcionários de uma
empresa que tem nome e salário. Para definir o campo para
o qual queremos ordenação usamos a interface Comparable .
Exemplo 3 TreeSet
public class Empregado implements Comparable<Empregado>{
private String nome;
private int salario;
Empregado(String nome, int salario) {
this.setNome(nome);
this.setSalario(salario);
}
// métodos set´s// métodos set´s
public String getNome(){
return this.nome;
}
public int getSalario(){
return this.salario;
}
public int compareTo (Empregado o) {
return this.salario - o.getSalario();
}
}
import java.util.*;
public class CriaEmpregado {
public static void main(String[] args) {
Empregado emp1 = new Empregado("Joao", 100);
Empregado emp2 = new Empregado("Maria", 120);
Empregado emp3 = new Empregado("Jose", 130);
Empregado emp4 = new Empregado("Ana", 110);
Empregado emp5 = new Empregado("Jimy", 130);
Collection <Empregado> c = new TreeSet <Empregado>();
Exemplo 3 TreeSet
Collection <Empregado> c = new TreeSet <Empregado>();
c.add(emp1);
c.add(emp2);
c.add(emp3);
c.add(emp4);
c.add(emp5);
Iterator i = c.iterator();
while ( i.hasNext() ) {
Empregado e = (Empregado) i.next();
System.out.println(e.getNome() + " " + e.getSalario());
}
}
}
>Joao 100
>Ana 110
>Maria 120
>Jose 130
Resultado – Exemplo 3 
>Jose 130
Algoritmos de coleções
� Página 686, seção 19.6 (Livro Deitel)
• Algoritmo sort
• Algoritmo shuffle
• Algoritmos reverse, fill, copy, max e min
• Algoritmo binarySearch

Outros materiais