Baixe o app para aproveitar ainda mais
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.
Compartilhar