7. Arrays - Departamento de Informática — UFPB

Propaganda
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
Download