Buscar

PC2 Aula04

Prévia do material em texto

© ELFS 62 
4. Vetores e Coleções 
•  Em Java, vetores têm tamanho fixo e, uma vez criados, não podem 
ser redimensionados. 
•  Um vetor é um objeto da classe Object. Depois de criado, o vetor 
possui campos e métodos como qualquer outro objeto. O campo 
length contém o tamanho do vetor. 
•  Os elementos de um vetor são identificados por meio de índices. O 
primeiro elemento tem o índice 0 (zero). Portanto, para um vetor de n 
elementos, os índices variam de 0 a n-1. 
•  Exemplo: Vetor v de 5 elementos 
•  Vetores são declarados utilizando-se colchetes. 
Exemplo: double a[], b[], c[]; 
•  Como para qualquer objeto, apenas a declaração do vetor não cria o 
objeto. A declaração cria apenas uma variável de referência (ponteiro) 
para o vetor. A memória a ser utilizada pelo vetor é alocada pela 
instrução new ou pela inicialização do vetor. 
v[0] v[1] v[2] v[3] v[4] 
v 
© ELFS 63 
Exemplos: 
 
 
 
 
 
 
 
 
•  Vetores podem ter mais de uma dimensão. Um vetor bidimensional é 
conhecido como matriz. 
 
 
 
 
4. Vetores e Coleções 
char letra[] = new char[26]; 
Ponto p[] = new Ponto[3]; 
int x[] = {2,8,3,5,1}; 
String nome[]; 
Scanner s = new Scanner(System.in); 
int n = s.nextInt(); 
nome = new String[n]; 
int w[][] = new int[2][5]; 
 
int m[][] = {{1,2},{3,4}}; 
w é uma matriz 2 x 5 (2 linhas e 5 colunas) 
m = 1 2 
 3 4 
© ELFS 64 
4. Vetores e Coleções 
•  Imagine que um programa precisa manter um conjunto ordenado de 
números inteiros fornecidos pelo usuário. O que é preciso fazer? 
1) Declarar um vetor. De qual tamanho? 
2) Manter uma variável N que indica quantos elementos o conjunto contém. 
3) A cada novo número recebido, verificar se ele já existe no vetor e, caso 
não exista, incluir. 
 N = 3 Novo = 4 
 
 
 
•  E para remover um valor já existente? 
 N = 4 Excluir = 2 
2 6 8 2 6 8 
2 4 6 8
2 4 6 8 4 6 8 
4 6 8
© ELFS 65 
4. Vetores e Coleções 
•  Usando uma coleção: 
public static void main(String[] args) 
{ 
 Scanner s = new Scanner(System.in); 
 TreeSet ts = new TreeSet(); 
 while (true) 
 { 
 System.out.println("(I)ncluir, (E)xcluir, (F)im? "); 
 String x = s.next(); 
 if (x.equals("F")) 
 { 
 break; 
 } 
 System.out.println("Valor: "); 
 int v = s.nextInt(); 
 
 if (x.equals("I")) 
 ts.add(v); 
 
 if (x.equals("E")) 
 ts.remove(v); 
 } 
 System.out.println(ts); 
} 
Observar que para incluir um novo 
elemento existe o método add() e para 
excluir um elemento existe o método 
remove(). Os elementos podem ser 
incluídos e excluídos em qualquer ordem. 
O conjunto se mantém ordenado 
automaticamente. 
© ELFS 66 
4. Vetores e Coleções 
•  Vetores: estruturas de tamanho fixo para armazenar dados homogêneos. 
•  Coleções: estruturas de tamanho variável (pode aumentar ou diminuir) para 
armazenar dados heterogêneos. 
•  Algumas coleções disponíveis no pacote java.util: 
•  Conjuntos: coleções sem possibilidade de elementos duplicados. 
HashSet (conjunto), TreeSet (conjunto ordenado) 
•  Listas: coleções com possibilidade de elementos duplicados. 
ArrayList (vetor redimensionável, muito eficiente), LinkedList (menos 
eficiente, mas com alguns métodos especiais) 
•  Listas Associativas: coleções de pares (chave, valor). 
HashMap (lista associativa), TreeMap (lista de pares ordenados pelo 
valor da chave). 
 
3 5 8 10 3 5 10 
3 A 8 10 3 A 15 3 A 15 X 
© ELFS 67 
Navegação em Coleções 
•  Percorrer uma coleção é acessar cada um de seus itens individualmente. A 
linguagem Java dispõe de alguns mecanismos para percorrer uma coleção. O 
melhor mecanismo é usar um iterador. 
•  Cada coleção define o método iterator(), que retorna um iterador para a 
coleção. Iteradores também são objetos e dispõem de diversos métodos 
que implementam operações de navegação. 
•  Métodos mais importantes: hasNext() e next(). 
 
4. Vetores e Coleções 
void percorrer(TreeSet ts) 
{ 
 Iterator iter = ts.iterator(); 
 while (iter.hasNext()) 
 { 
 int item = iter.next(); 
 ... 
 } 
} 
© ELFS 68 
4. Vetores e Coleções 
Conjuntos 
•  Os principais métodos disponíveis para conjuntos são: 
•  int size(): retorna o tamanho (número de elementos) do conjunto. 
•  boolean isEmpty(): retorna true se o conjunto é vazio. 
•  void add(Object obj): adiciona o objeto obj no conjunto. 
•  void remove (Object obj): remove o objeto obj do conjunto. 
public class ExemploTreeSet { 
 public static void main (String [] args) { 
 int i = 0; 
 TreeSet t = new TreeSet(); 
 t.add(1); 
 t.add(3); 
 t.add(4); 
 t.add(2); 
 System.out.println("TreeSet: " + t); 
 Iterator elem = t.iterator(); 
 while (elem.hasNext()) { 
 System.out.println("Elemento[" + i + "]=" + elem.next()); 
 i++; 
 } 
 } 
} 
ExemploTreeSet.java 
Como o conjunto é do tipo 
TreeSet, os elementos são 
mostrados em ordem 
crescente: TreeSet: [1, 2, 3, 4] 
Elemento[0]=1 
Elemento[1]=2 
Elemento[2]=3 
Elemento[3]=4 
Os elementos de um conjunto do tipo 
TreeSet devem ser de um mesmo tipo, 
para que possam ser comparados. 
© ELFS 69 
4. Vetores e Coleções 
public class ExemploHashSet 
{ 
 public static void main (String [] args) 
 { 
 HashSet hs = new HashSet(); 
 
 // Inserir elementos no conjunto 
 hs.add("um"); 
 hs.add("dois"); 
 hs.add("tres"); 
 hs.add(7.0); 
 hs.add(7); 
 hs.add("um"); // como está duplicado não é adicionado 
 
 System.out.println(hs); 
 
 Iterator elemento = hs.iterator(); 
 int i = 0; 
 while (elemento.hasNext()) 
 { 
 System.out.println("Elemento[" + i + "]=" + elemento.next()); 
 i++; 
 } 
 } 
} 
ExemploHashSet.java 
Elemento[0]=tres 
Elemento[1]=dois 
Elemento[2]=7 
Elemento[3]=7.0 
Elemento[4]=um 
Notar que os elementos de um 
conjunto do tipo HashSet podem ser 
de tipos diferentes. 
A ordem dos elementos de um 
conjunto do tipo HashSet é 
especiificada internamente: 
[tres, dois, 7, 7.0, um] 
© ELFS 70 
4. Vetores e Coleções 
Listas 
•  Os principais métodos disponíveis para listas são: 
•  boolean add(Object o): adiciona o objeto o ao final da lista. 
•  void add(int i, Object o): insere o objeto o na posição i da lista. 
•  Object get(int i): recupera o objeto da posição i. 
•  int indexOf(Object o): retorna o índice da primeira ocorrência de o. 
•  Object set(int i, Object o): grava o objeto o na posição i apagando o 
objeto que se encontrava nesta posição. 
•  Object remove(int i): remove o objeto da posição i. 
•  void clear(): remove todos os elementos da lista. 
•  boolean isEmpty(): retorna true se a lista estiver vazia. 
•  boolean contains(Object o): retorna true se a lista contém o objeto o. 
 
© ELFS 71 
4. Vetores e Coleções 
public class ExemploLista 
{ 
 public static void main (String [] args) 
 { 
 Date inicio,fim; 
 double duracao; 
 
 Aleatorio na = new Aleatorio(); 
 
 ArrayList lista = new ArrayList(); 
 for (int i = 0; i < 100; i++) 
 { 
 lista.add(i); 
 } 
 
 System.out.println("Lista: " + lista); 
ExemploLista.java 
A lista é construída, inicialmente, 
com 100 elementos: 0, 1, ..., 99. 
Lista: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ..., 99] 
public class Aleatorio 
{ 
 public int gerar(int a, int b) 
 { 
 return ((int)(a + (b-a+1)*Math.random())); 
 } 
} 
Aleatorio.java 
A classe Aleatorio será usada para 
gerar números inteiros aleatórios em 
um dado intervalo [a, b]. 
Objetos da classe Date serão usados 
para determinar o tempo gasto em 
um trecho do programa. 
© ELFS 72 
4. Vetores e Coleções 
 inicio= new Date(); 
 for (int i = 0; i < 100000; i++) 
 { 
 int enovo = na.gerar(0,100); 
 int index = na.gerar(0,lista.size()); 
 lista.add(index,enovo); 
 } 
 fim = new Date(); 
 duracao = (double)(fim.getTime() - inicio.getTime()); 
 System.out.println("100000 inserções em " + duracao/1000 + 
 " segundos - Tamanho final da lista = " + lista.size()); 
 
 int chave = na.gerar(0,100); 
 System.out.println("Procurando o valor " + chave + " ..."); 
 if (lista.contains(chave)) 
 { 
 System.out.println("Valor " + chave + " encontrado na posicao " + 
 lista.indexOf(chave) + " da lista."); 
 } 
 else 
 System.out.println("A lista não contém o elemento " + chave); 
 } 
} 
 
Serão feitas 100000 inserções 
de elementos na lista (gera-se o 
elemento a ser inserido e a posição 
onde ele deve entrar na lista). 
100000 inserções em 0.676 segundos - Tamanho final da lista = 100100 
Procurando o valor 61 ... 
Valor 61 encontrado na posicao 58 da lista. 
Trocando-se ArrayList por LinkedList o tempo passou a 14.965 segundos 
© ELFS 73 
4. Vetores e Coleções 
Listas Associativas 
•  Coleção de pares constituídos por (chave, valor). 
Exemplo: [ (Maria, 22), (Pedro, 31), (João, 50), (Ana, 15) ] 
•  Numa lista associativa, a recuperação de um elemento da coleção é feita pelo 
valor da chave (e não por um índice numérico, como no caso das listas). 
•  Os principais métodos disponíveis para listas associativas são: 
•  void put(Object k, Object o): adiciona um par (k, o) na coleção. 
•  Object get(Object k): recupera o objeto valor associado à chave k. 
•  Set keySet(): retorna um conjunto de chaves. 
•  Collection values(): retorna uma coleção de valores. 
© ELFS 74 
4. Vetores e Coleções 
public class ExemploMap 
{ 
 public static void main(String[] args) 
 { 
 TreeMap tm = new TreeMap(); 
 tm.put(2,"Gustavo"); 
 tm.put(4,"Murilo"); 
 tm.put(1,"Luis"); 
 tm.put(3,"Thais"); 
 tm.put(6,"Maria"); 
 tm.put(5,"Gabriela"); 
 tm.put(6,"Felipe"); 
 System.out.println("TreeMap: " + tm); 
 
 // Percorrendo a coleção 
 Iterator i = tm.keySet().iterator(); 
 Iterator j = tm.values().iterator(); 
 while (i.hasNext()) 
 { 
 System.out.println("Chave: " + i.next() + " - Valor: " + j.next()); 
 } 
 } 
} 
 
 
TreeMap: {1=Luis 2=Gustavo, 3=Thais, 4=Murilo, 5=Gabriela, 6=Felipe} 
Chave: 1 – Valor: Luis 
Chave: 2 – Valor: Gustavo 
Chave: 3 – Valor: Thais 
Chave: 4 – Valor: Murilo 
Chave: 5 – Valor: Gabriela 
Chave: 6 – Valor: Felipe 
ExemploMap.java 
Os valores das chaves devem ser 
únicos. A inclusão de um novo par com 
uma chave igual a de um par já existente 
provoca a exclusão do par antigo.

Continue navegando