Introdução à Programação Um enfoque orientado a construção de modelos em programas baseados em objetos Gustavo Motta Departamento de Informática - UFPB 7. Arrays ► Definição Um array em Java é uma estrutura de dados que permite o armazenamento de um conjunto de variáveis (elementos) de um mesmo tipo (ou referências para instâncias de uma mesma classe) e que são acessadas individualmente por um índice char[] letrasAlfabeto = {'a', 'b', 'c', 'd', 'h', 'i', 'j', 'k', 'o', 'p', 'q', 'r', 'v', 'w','x', 'y', 'z'}; 'e', 'l', 's', 'f', 'm', 't', 'g', 'n', 'u', letrasAlfabeto[0] a letrasAlfabeto[1] b ... letrasAlfabeto[25] z (C) 2008 Gustavo Motta 2 7. Arrays ► Usos mais comuns Armazenar grandes quantidades de dados de um mesmo tipo ou classe 1440 amostras do tipo double da temperatura de um paciente internado, medida a cada minuto, durante um dia As 38 instâncias da classe Aluno, componentes de uma turma ► Utilizar variáveis individuais e com nomes distintos em casos como estes é extremamente trabalhoso e sujeito a erros O uso de arrays permite usar um único nome para denotar um conjunto homogêneo de variáveis, que são acessadas individualmente através de índices (C) 2008 Gustavo Motta 3 7. Arrays ► Tipos de arrays Unidimensionais ► Elementos são acessados por um único índice alunos[0] alunos[1] Bidimensional ► Elementos são acessados por um par de índices, especificando linha e coluna de uma matriz turmaAluno[0][1] turmaAluno[1][10] Multidimensional ► Elementos são acessados por um número arbitrário de índices (C) 2008 Gustavo Motta 4 7. Arrays ► Declaração e alocação de arrays unidimensionais Java adota a notação de colchetes para declarar arrays ► Uma variável de um tipo (classe) específico seguido de um par de colchetes declara uma referência a um array de elementos desse tipo int[] posiçõesDeMemória; char letrasAlfabeto[]; double[] medidaTemperatura; ►A declaração acima define apenas referências para arrays, mas não cria nenhuma variável do tipo array na memória É preciso criar (alocar) o array na memória com um número predeterminado de posições Opcionalmente, pode-se inicializá-lo na cláusula de declaração (C) 2008 Gustavo Motta 5 7. Arrays ► Declaração e alocação de arrays unidimensionais Alocação de arrays ► Cria a variável correspondente ao array na memória com para um número de elementos predeterminado Comando realizado pela palavra-chave new, seguida pelo tipo do dado do array e do número de elementos a alocar, entre colchetes int[] posiçõesDeMemória = new int[16]; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int tamanho = 32768; posiçõesDeMemória = new int[tamanho]; double[] medidasTemperatura = new int[24 * 60 * 60]; (C) 2008 Gustavo Motta 6 7. Arrays ► Declaração e alocação de arrays unidimensionais Inicialização ► Pode ser realizada na cláusula de declaração, para pequeno número de elementos sabidos a priori int[] ultimoDiaMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; String[] universidades = {"UFPB", "UFCG", "UEPB", "CEFET", "UNIPE"}; ► Pode ser realizada após a alocação/criação criação do array String[] universidades = new String[5]; universidades[0] = "UFPB"; universidades[1] = "UFCG"; universidades[2] = "UEPB"; universidades[3] = "CEFET"; universidades[4] = "UNIPE"; 00 1 UFPB UFCG 2 3 4 UEPB CEFET UNIPE (C) 2008 Gustavo Motta 7 7. Arrays ► Acesso a elementos O índice para acesso a um elemento deverá ser um valor do tipo inteiro entre 0 e o tamanho do array subtraído de 1 nome_do_array[indice] ► Qualquer tentativa de acesso com valor de índice fora dessa faixa resulta em erro em tempo de execução, com a interrupção da execução do programa, indicado pela exceção ArrayIndexOutOfBoundsException ►O tamanho –quantidade de elementos– de um array pode ser lido através da variável length, existente em todo array universidades.length 5 ultimoDiaMes.length 12 (C) 2008 Gustavo Motta 8 7. Arrays ► Acesso a elementos – exemplo Método para computar a série de fibonacci long[] fibonacci(int n) { long[] serie = new long[n]; if (n > 0) { serie[0] = 1; } if (n > 1) { serie[1] = 1; } for (int i = 2; i < n; i++) { serie[i] = serie[i - 1] + serie[i - 2]; } return serie; } (C) 2008 Gustavo Motta 9 7. Arrays ► Arrays de instâncias de classes Array no qual os elementos são instâncias de classes ► Cada elemento deverá ser criado para inicializar o array CartaoDeCredito[] void defineCartoes(int nCartoes) { System.out.println("Configuracao do sistema de cartoes 'SysCard'."); System.out.println("Entre com a bandeira de "+nCartoes+" cartoes ..."); CartaoDeCredito[] cartoes = new CartaoDeCredito[nCartoes]; Scanner entrada = new Scanner (System.in); for (int n = 0; n < cartoes.length; n++) { cartoes[n] = new CartaoDeCredito(); System.out.print("Entre com a bandeira do cartão '"+n+"': "); String bandeira = entrada.nextLine(); cartoes[n].defineBandeira(bandeira); System.out.println(); } return cartoes; } (C) 2008 Gustavo Motta 10 7. Arrays ► Ordenação Disposição dos elementos de um array segundo a relação de ordem – crescente ou decrescente ► Ordem alfabética, numérica, etc. Agenda de telefônica Relação de aprovados no vestibular Páginas de um livro Existem diversos algoritmos para ordenação, por exemplo ► Bubblesort Simples, porém ineficiente ► Quicksort Elaborado, porém eficiente (C) 2008 Gustavo Motta 11 7. Arrays ► Ordenação – Algoritmo Bubblesort Condição de entrada – pré-condição ► Condição de saída – pós-condição ► O array para ser ordenado O array ordenado Algoritmo 1. Enquanto o array não estiver ordenado, repita 2. Examine cada par de elementos adjacentes no array e inverta a posição dos valores que estão fora de ordem Passo 5 1 2 3 4 int[] idades = {60, 42, 75, 83, 27}; idades[0] idades[1] 42 42 27 60 60 27 42 42 idades[3] 27 60 75 60 75 27 83 75 idades[4] 83 27 83 idades[2] 27 27 42 60 42 42 75 27 60 60 42 27 27 42 27 60 42 42 42 27 42 42 27 27 60 60 42 42 27 42 27 42 60 27 42 42 60 75 60 60 75 83 27 75 75 60 27 75 60 60 75 75 83 75 75 27 75 60 60 60 75 27 75 75 75 83 83 27 83 83 83 83 83 83 83 27 75 75 (C) 2008 Gustavo Motta 83 27 27 83 83 83 83 83 12 7. Arrays ► Ordenação – Algoritmo Bubblesort public long[] sort(long[] data) { boolean ordenado = true; do { ordenado = true; for (int n = 0; n < data.length - 1; n++) { if (data[n] > data[n + 1]) { long temp = data[n]; data[n] = data[n + 1]; data[n + 1] = temp; ordenado = false; } } } while (!ordenado); return data; } (C) 2008 Gustavo Motta 13 7. Arrays ► Ordenação - Algoritmo QuickSort Condição de entrada – pré-condição ►O array a ser ordenado – long[] data ► Os índices inicial –int início– e final –int fim– do array Condição de saída – pós-condição ►O array ordenado - long[] data Algoritmo QuickSort ► 1. Se início < fim, então 2. Particione os elementos no subarray entre início e fim, de modo que, todos os valores menores ou iguais ao pivô estejam à sua esquerda e que todos os valores maiores que ele estejam a sua direita, onde ► O valor inicial do pivô é pivô = data[início] ► O valor final da nova posição do pivô –pivôPos– é aquela onde todos os elementos <= data[pivôPos] têm índice < que pivôPos e todos os elementos > data[pivôPos] têm índice > que pivôPos 3. Aplique o algoritmo QuickSort para o subarray entre início e pivôPos - 1 (C) 2008 Gustavo Motta 4. Aplique o algoritmo QuickSort para o subarray entre pivôPos + 1 e fim 14 7. Arrays ► Ordenação - Algoritmo QuickSort Pivô Pivô 44 12 33 23 23 33 43 0 1 2 3 Pivô Pivô Pivô 12 44 55 64 75 77 77 75 4 5 6 7 8 particiona início fim particiona particiona particiona início fim 12 33 23 23 33 43 44 55 64 75 77 77 75 0 1 2 3 4 5 6 7 8 (C) 2008 Gustavo Motta 15 private int particiona(long[] data, int início, int fim) { long pivô = data[início]; 7. Arrays int avanço = início; ► Ordenação Algoritmo =QuickSort int -retrocesso fim; do { while ((data[avanço] <= pivô) && (avanço < fim)) avanço = avanço + 1; while (data[retrocesso] > pivô) public void quickSort(long[] data, int- início, int fim) { retrocesso = retrocesso 1; if (avanço if (início < fim) < { retrocesso) { long temp = data[avanço]; int pivôPos = particiona(data, início, fim); data[avanço] = data[retrocesso]; quickSort(data, início, pivôPos - 1); data[retrocesso] = temp; quickSort(data, pivôPos + 1, fim); } } } } while (avanço < retrocesso); long temp = data[retrocesso]; data[retrocesso] = data[início]; data[início] = temp; return retrocesso; (C) 2008 Gustavo Motta } 16 7. Arrays ► Ordenação - Algoritmo QuickSort Pivô Pivô Pivô Pivô 12 44 44 12 23 33 75 75 23 33 23 33 43 43 Pivô Pivô Pivô Pivô 44 55 55 44 12 55 12 12 55 64 64 77 77 75 75 33 75 33 77 retrocesso retrocesso avanço avanço avanço retrocesso retrocesso avanço retrocesso avanço retrocesso retrocesso retrocesso avançoavanço avanço avanço avanço retrocesso retrocesso retrocesso retrocesso retrocesso avanço retrocesso (C) 2008 Gustavo Motta 17 7. Arrays ► Arrays multidimensionais Elementos são acessados por um número arbitrário de índices ► Matrizes matemáticas double[][] matriz = new double[5][10]; ... public double maiorValor() { double maiorAtéAgora = matriz[0][0]; for (int lin= 0;lin < matriz.length; lin++) for (int col = 0; col < matriz[lin].length; col++) if (matriz[lin][col] > maiorAtéAgora) maiorAtéAgora = matriz[lin][col]; return maiorAtéAgora; } (C) 2008 Gustavo Motta 18 7. Arrays ► Arrays multidimensionais irregulares Não têm o mesmo número de elementos em cada dimensão ► Um array em Java nada mais é do que um array cujos elementos são arrays, com exceção do elemento mais interno double[] [] matriz = new double[5][]; matriz[0] = new double[2]; matriz[1] = new double[5]; matriz[2] = new double[3]; ... public double maiorValor() { double maiorAtéAgora = matriz[0][0]; for (int lin= 0;lin < matriz.length; lin++) for (int col = 0; col < matriz[lin].length; col++) if (matriz[lin][col] > maiorAtéAgora) maiorAtéAgora = matriz[lin][col]; return maiorAtéAgora; } (C) 2008 Gustavo Motta 19