Anda di halaman 1dari 62

Sistemas de Informao

Linguagem de Programao II
1

Arrays
FJN | Faculdade de Juazeiro do Norte
Bacharelado em Sistemas de Informao
Linguagem de Programao II
Prof. Sidney Lima

Arrays
Um array uma estrutura de dados consistindo em itens de
dados do mesmo tipo relacionados.
Os arrays so objetos, portanto, considerados tipos por
referncia.
Para referenciar um elemento do
array deve-se utilizar uma
expresso de acesso ao
array, que inclui o nome do
array seguido pelo nmero da
posio do elemento no array
(dentro de colchetes)

Nome do array (C)

O nmero de posio do
elemento chamado de ndice
ou subscrito do elemento.

ndice (ou subscrito)


do elemento do array

FJN | SI | LP2

PROF. SIDNEY

C[ 0 ]

-45

C[ 1 ]

C[ 2 ]

C[ 3 ]

72

C[ 4 ]

154

C[ 5 ]

89

Arrays
Cada objeto de array conhece seu prprio tamanho e
armazena-o em uma varivel de instncia denominada
length. A expresso c.length acessa o campo length do array c
para determinar o comprimento do array.
Algumas operaes:
C

soma = c[1]+c[2]+c[3]

x = c[3]/8

FJN | SI | LP2

PROF. SIDNEY

C[ 0 ]

-45

C[ 1 ]

C[ 2 ]

C[ 3 ]

72

C[ 4 ]

154

C[ 5 ]

89

length

Declarando e Criando Arrays


int[] c = new int[6];
ou
// declarao da varivel de array
int[] c;
// cria o array e atribui varivel de array
c = new int[6];

Obs.: quando um array criado, cada


elemento do array recebe um valor padro.

FJN | SI | LP2

PROF. SIDNEY

C[ 0 ]

C[ 1 ]

C[ 2 ]

C[ 3 ]

C[ 4 ]

C[ 5 ]

length

Observao de Engenharia de Software


Um programa pode criar vrios arrays em uma s
declarao, embora isso no seja uma boa prtica.
String[] b = new String[100], x = new String[25];
Poderia ser assim:
String[] b = new String[100]; // cria o array b
e
String[] x = new String[25]; / / cria o array x

FJN | SI | LP2

PROF. SIDNEY

Observao de Engenharia de Software


Declarar mltiplas variveis de array em uma nica
declarao pode levar a erros sutis, devido ao
posicionamento dos pares de colchetes [].

Considere as seguintes declaraes:


int[] a, b, c; // define a, b e c como arrays de inteiros
int a[], b, c; // declara a como array de int, b e c como
// variveis primitivas de valore do tipo inteiro.

FJN | SI | LP2

PROF. SIDNEY

Exerccio: criando e incializando um array


1 public class InitArray
2 {
3

public static void main(String[] args)

int[] array;

array = new int[10];

System.out.printf("%s%8s","Index","Value");

for (int counter = 0; counter < array.length; counter++)

10
11
12

System.out.printf("%5d%8d\n",counter,array[counter]);
}
}

continua >>

13 }
FJN | SI | LP2

PROF. SIDNEY

Utilizando um inicializador de array


Voc pode criar um array e inicalizar seus elementos com um
inicializador de arrays: uma lista separada por vrgula
colocada entre chaves.
Nesse caso, o comprimento do array determinado pelo
nmero de elementos na lista.
n

Exemplo:
int[] n = { 10, 20, 30, 40, 50}

FJN | SI | LP2

PROF. SIDNEY

n[ 0 ]

10

n[ 1 ]

20

n[ 2 ]

30

n[ 3 ]

40

n[ 4 ]

50

length

Exerccio: somando os elementos do array


1 public class SumArray
2 {
3

public static void main(String[] args)

int[] array = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87};

int total = 0;

for (int counter = 0; counter < array.length; counter++)

total += array[counter];

10

11

System.out.printf("Total of array elements: %d\n",total);

12

13 }
FJN | SI | LP2

PROF. SIDNEY

10

Exerccio: imprimindo um array


1 public class TestArrays
2 {
3

public static void main(String[] args)

int[] lista = {22, 44, 66, 88};

System.out.println("Array de Inteiros: "+lista);

System.out.println("lista.length: "+lista.length);

System.out.println("lista[2]: "+lista[2]);

lista

0 22

10

lista[2] = 99;

1 44

11

System.out.println("lista[2]: "+lista[2]);

2 66

12
13

3 88

}
int[]

14 }
FJN | SI | LP2

PROF. SIDNEY

11

Arrays
Observao:
Para a instruo:
System.out.println("Array de Inteiros: "+lista);
A sada ser algo como:
Array de Inteiros: [I@3e25a5
O que significa uma referncia para um array de ints. Isto
acontece porque estamos tentando imprimir um objeto, logo, o
que apresentado na tela corresponde a
type-id@mem-addr
onde type-id um identificador de tipo e mem-addr o
endereo de memria onde o objeto est armazenado. Neste
caso, type-id [I (que significa um array cujos elementos
possuem o tipo int) e mem-addr 3e25a5.
FJN | SI | LP2

PROF. SIDNEY

12

Exerccio: imprimindo um array


1 public class TestArrays
2 {
3

public static void main(String[] args)

int[] lista = {22, 44, 66, 88};

System.out.println("Array de Inteiros: "+lista);

System.out.println("lista.length: "+lista.length);

System.out.println("lista[2]: "+lista[2]); lista


print(lista);

10

lista[2] = 99;

11

System.out.println("lista[2]: "+lista[2]);

12

print(lista);

13

FJN | SI | LP2

0 22
1 44
2 66
3 88
int[]

continua >>
PROF. SIDNEY

13

Exerccio: Imprimindo um array


continuao >>
14

public static void print(int[] a) {

15

for (int i=0; i< a.length; i++)

16

System.out.print(a[i]+" ");

17
18

System.out.println();
}

19 }

FJN | SI | LP2

PROF. SIDNEY

14

A estrutura for aprimorada (foreach


(foreach)
)
A instruo for aprimorada itera pelos elementos de um
array sem usar um contador, evitando assim a possibilidade de
ultrapassar o limite do array.
Sintaxe:
for ( parmetro : nomeDoArray )
instruo
onde parmetro tem duas partes um tipo e um identificador
e nomeDoArray o array pelo qual iterar.
Obs.: o tipo do parmetro deve ser consistente com o tipo de
elementos no array. O identificador representa valores
sucessivos do array nas sucessivas iteraes do loop.
FJN | SI | LP2

PROF. SIDNEY

15

Exerccio: for aprimorado (foreach


(foreach)
)
1 public class EnhancedForTest
2 {
3

public static void main(String[] args) {

int[] array = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87};

int total = 0;

for (int number : array)

total += number;

10

11

System.out.printf("Total of array elements: %d\n",total);

12

} // fim do mtodo main

13 } // fim da classe EnhancedForTest


FJN | SI | LP2

PROF. SIDNEY

16

Cpia de Arrays
Como se sabe, um array um objeto e, como qualquer objeto,
seu nome na realidade o nome de uma referncia a este
objeto. Consequentemente, atribuir um array a outro no
duplica o array; isto meramente atribui uma outra referncia
ao mesmo objeto.
Desta forma, se as instrues seguintes fossem acrescentadas
ao cdigo anteriormente exibido, teramos o que est
representado na figura ao lado:
int[] lista2;
lista2 = lista;

lista

0 22

lista2

1 44
2 66
3 88
int[]

FJN | SI | LP2

PROF. SIDNEY

17

Cpia de Arrays
Para copiar o prprio objeto array, voc deve copiar cada um
de seus elementos. A maneira mais eficiente de fazer isto
usar o mtodo System.arraycopy().
Sintaxe:

arraycopy(src,srcPos,dest,destPos,length)
onde src o array de origem, srcPos o ndice do primeiro
elemento do array de origem a ser copiado, dest o array de
destino, destPos o ndice onde o primeiro elemento deve
ser copiado no array de destino, e length o nmero de
elementos a serem copiados.

FJN | SI | LP2

PROF. SIDNEY

18

Cpia de Arrays
Exemplo: arraycopy(lista,4,lista2,2,3)
Indica que haver cpia de 3 elementos de lista[] para lista2[]:
lista

int[]

22

lista2

33

44

66

55

77

66

88

77

88

99

int[]

Os elementos {lista[4],lista[5],lista[6]} so copiados para


{lista2[2],lista2[3],lista2[4]}.
FJN | SI | LP2

PROF. SIDNEY

19

Exerccio: copiando um array


1 public class TestArrays2 {
2

public static void main(String[] args) {

int[] lista = {22,33,44,55,66,77,88,99};

print(lista);

int[] lista2 = new int[lista.length];

System.out.println("lista2: "+lista2);

print(lista2);

System.arraycopy(lista, 0, lista2, 0, lista.length);

System.out.println("lista2: "+lista2);

10

print(lista2);

11

lista2[1] = 11;

12

print(lista);

13

print(lista2);

14

lista2 = new int[12];

FJN | SI | LP2

PROF. SIDNEY

continua >>
20

Exerccio: Imprimindo um array


continuao >>
15

System.arraycopy(lista, 0, lista2, 3, 8);

16

System.out.println("lista2: "+lista2);

17

print(lista2);

18

System.arraycopy(lista2, 3, lista2, 1, 5);

19

System.out.println("lista2: "+lista2);

20

print(lista2);

O mtodo System.arraycopy()
tambm funciona para
21 }
deslocar um segmento de
22 public static void print(int[] a) {
elementos dentro de um
23
for (int i=0; i<a.length; i++)
mesmo array.

24

System.out.print(a[i]+" ");

25
26

System.out.println();
}

utilizar foreach

27 }
FJN | SI | LP2

PROF. SIDNEY

21

Passagem de Arrays em Mtodos


Anteriormente, no estudo de mtodos, vimos que possvel a
criao de mtodos que recebem valores, manipulam valores e
retornam um resultado.
Na passagem desses valores pode ser usado qualquer tipo de
varivel (int, float, double, por exemplo). Da mesma forma,
possvel tambm criar mtodos com passagem e retorno de
arrays.
O funcionamento basicamente o mesmo: quando o mtodo
invocado, um array qualquer passado, o qual manipulado
internamente pelo mtodo e depois retornado.

FJN | SI | LP2

PROF. SIDNEY

22

Passagem de Arrays em Mtodos


Veja a sintaxe simples para um mtodo que recebe e retorna
um array:
public static tipo-de-array[] nome-do-metodo(tipo-doarray nome-do-array[])
O prximo exerccio apresenta um mtodo que recebe um
array do tipo inteiro, organiza seus elementos e o retorna em
ordem crescente. Esses elementos sero passados pelo usurio
na linha de comando no momento da execuo do programa.

FJN | SI | LP2

PROF. SIDNEY

23

Exerccio
import javax.swing.JOptionPane;
public class OrdenaValores {
public static void main(String[] args) {
int array[] = new int[5]; //cria um array com 5 elementos
String saidaDigitada = "Array digitado: ";
for (int i=0;i<5;i++) { //armazena elementos no array
array[i]=Integer.parseInt(JOptionPane.showInputDialog(null,
"Fornea o nmero "+(i+1)+" entre 0 e 100: "));
saidaDigitada += array[i]+" - ";
}

continua >>
FJN | SI | LP2

PROF. SIDNEY

24

Exerccio
continuao >>
array = ordenaArrayInt(array);
String saidaOrdenada = "Array ordenado: ";
for (int i = 0; i < array.length; i++)
saidaOrdenada += array[i] + " - ";
saidaDigitada = removeTraco(saidaDigitada);
saidaOrdenada = removeTraco(saidaOrdenada);
JOptionPane.showMessageDialog(null, saidaDigitada + "\n" +
saidaOrdenada);
System.exit(0);
}

continua >>
FJN | SI | LP2

PROF. SIDNEY

25

Exerccio
continuao >>
public static int[] ordenaArrayInt(int arr[]) {
int x, y, aux;
for (x = 0; x < arr.length; x++)
for (y = 0; y < arr.length; y++) {
if (arr[x]<arr[y]) {
aux=arr[y];
arr[y]=arr[x];
arr[x]=aux;
}
}
return (arr);
}

continua >>
FJN | SI | LP2

PROF. SIDNEY

26

Exerccio
continuao >>
public static String removeTraco(String str) {
.
.
.
}
}

FJN | SI | LP2

PROF. SIDNEY

27

Exerccio
continuao >>
public static String removeTraco(String str) {
str = str.substring(0, str.length()-2);
return str;
}
}

FJN | SI | LP2

PROF. SIDNEY

28

Arrays de Strings e outros objetos


Os exemplos anteriores ilustram um array do tipo int. Outras
possibilidades incluem arrays do tipo double,

double[] vector = {3.14, 2.178, 1.414};


arrays do tipo

char,
char[] strings = {'J','a','v','a'};
e arrays do tipo

Object,
Object[] objetos = {x, y, z};

FJN | SI | LP2

PROF. SIDNEY

29

Arrays de Strings e outros objetos


Todo programa Java usa um array do tipo String, declarado
como parmetro de seu mtodo main().
Embora ele possa ter qualquer nome, ele geralmente
denominado args, para indicar "argumentos". Este array
armazena os argumentos de linha de comando que voc pode
fornecer quando voc executa seu programa a partir da linha
de comando. O exemplo seguinte ilustra a passagem de
argumentos na chamada de um programa.

FJN | SI | LP2

PROF. SIDNEY

30

Exerccio
public class TestArgs {
public static void main(String[] args) {
System.out.println("args.length: "+args.length);
for (int i = 0; i < args.length; i++)
System.out.println("args["+i+"]: "+args[i]);
System.out.println();
for (int i = args.length-1; i >= 0; i--)
System.out.println("args["+i+"]: "+args[i]);
}
}

FJN | SI | LP2

PROF. SIDNEY

31

Arrays de Strings e outros objetos


Suponha que vamos compilar e executar este programa a
partir de linha de comando, como segue:
javac TestArgs.java
java TestArgs Juazeiro do Norte
Ento a sada ser:
args.length: 3
args[0]: Juazeiro
args[1]: do
args[2]: Norte
args[2]: Norte
args[1]: do
args[0]: Juazeiro

FJN | SI | LP2

PROF. SIDNEY

32

Arrays de Strings e outros objetos


Cada string (delimitado por espao em branco) que aparece
depois do comando java TestArgs salvo como um
elemento do array args.
Uma vez que qualquer tipo de dado pode ser armazenado na
forma de um string, podemos ver que o array args pode ser
usado para entrada de qualquer tipo de dado durante a
execuo.

FJN | SI | LP2

PROF. SIDNEY

33

Arrays de Strings e outros objetos


public class TestArgs2 {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Uso: java TestArgs <int> <double>");
System.exit(1);
}
int n = Integer.parseInt(args[0]);
System.out.println("O int : "+n);
double x = Double.parseDouble(args[1]);
System.out.println("o double : "+x);
}
}

FJN | SI | LP2

PROF. SIDNEY

34

Arrays de Strings e outros objetos


Executando como:
javac TestArgs2.java
java TestArgs 22 3.14
A sada ser:
O int : 22
o double : 3.14

FJN | SI | LP2

PROF. SIDNEY

35

Arrays Bidimensionais
Uma array bidimensional permite a criao de vetores com
mais de um ndice. Esta caracterstica possibilita que os valores
sejam armazenados na forma de matrizes de qualquer
dimenso.
O exerccio apresentado a seguir utiliza um array bidimensional
para coletar duas notas de trs alunos (um total de seis notas).
Uma vez armazenadas, o programa solicita ao usurio o
nmero de um aluno para mostrar suas notas e a mdia delas.

FJN | SI | LP2

PROF. SIDNEY

36

Arrays Bidimensionais
Uma array bidimensional permite a criao de vetores com
mais de um ndice. Esta caracterstica possibilita que os valores
sejam armazenados na forma de matrizes de qualquer
dimenso.
O exerccio apresentado a seguir utiliza um array bidimensional
para coletar duas notas de trs alunos (um total de seis notas).
Uma vez armazenadas, o programa solicita ao usurio o
nmero de um aluno para mostrar suas notas e a mdia delas.

FJN | SI | LP2

PROF. SIDNEY

37

Exerccio
Os aspectos mais importantes do exerccio a seguir so:
 So coletadas e armazenadas duas notas de trs alunos no
array no formato de uma tabela; o que feito atravs da
estrutura de loops aninhados e do comando abaixo:
notas[aluno][nota]=Float.parseFloat(JOptionPane.showInputDialog
(null,"Fornea a nota "+(nota+1)+" do aluno "+(aluno+1)));
Notas
0

Alunos
0

Aluno1

Nota1 ndice[0][0]

Nota2 ndice[0][1]

Aluno2

Nota1 ndice[1][0]

Nota2 ndice[1][1]

Aluno3

Nota1 ndice[2][0]

Nota2 ndice[2][1]

FJN | SI | LP2

PROF. SIDNEY

38

Exerccio
import javax.swing.JOptionPane;
public class CalculaMedias {
public static void main(String[] args) {
float notas[][] = new float[3][2];
int aluno = 0, nota;
while (aluno<3)
{
nota = 0;
while (nota<2)
{
notas[aluno][nota]=
Float.parseFloat(JOptionPane.showInputDialog
(null,"Fornea a nota "+(nota+1)+" do aluno "+(aluno+1)));
nota++;
}
continua >>
FJN | SI | LP2

PROF. SIDNEY

39

Exerccio
continuao >>
aluno++;
}
aluno =
Integer.parseInt(JOptionPane.showInputDialog(null,"Fornea o
nmero do aluno a consultar: "));
JOptionPane.showMessageDialog(null, "CONSULTA DE NOTAS: "+
"\nAluno: "+aluno+
"\nNota1: "+notas[aluno - 1][0]+
"\nNota2: "+notas[aluno - 1][1]+
"\nMedia: "+((notas[aluno-1][0]+notas[aluno-1][1])/2)
);
System.exit(0);
}
}
FJN | SI | LP2

PROF. SIDNEY

40

Exerccio: Array de Objetos


public class TestArrays {
public static void main(String[] args) {
Object[] a = new Object[5];
a[0] = new java.util.Date();
a[1] = "ABCDE";
a[2] = new java.util.Random();
a[3] = new int[] {22,33,44};
print(a);
a
}
private static void print(Object[] a) {
for (int i=0; i<a.length; i++)
System.out.println(i+". "+a[i]);
System.out.println();
}
}
FJN | SI | LP2

A sada:
0. Tue Apr 14 17:50:04 BRT 2009
1. ABCDE
2. java.util.Random@190d11
3. [I@a90653
4. null

Date

"ABCDE"

String

3
4
Random
Object[]

0 22
1 33
2 44
int[]

PROF. SIDNEY

41

Exerccio: Array de Objetos


No exerccio anterior, o array a[] declarado na linha 3 como
um array de elementos Object. Em Java, cada classe uma
extenso da classe Object, de modo que cada objeto se
qualifica como sendo desse tipo, seja direta ou indiretamente.
Consequentemente, qualquer objeto pode ser um elemento
deste array. Ele alocado na linha 3 para conter at 5 objetos.

Object[] a = new Object[5]

Date

"ABCDE"

String

3
4
Random
Object[]

0 22
1 33
2 44
int[]

FJN | SI | LP2

PROF. SIDNEY

42

Exerccio: Array de Objetos


A linha 4 atribui um novo objeto java.util.Date a a[0].
A linha 5 atribui o String "ABCDE" a a[1].
A linha 6 atribui um novo objeto java.util.Random a a[2].
A linha 7 atribui um novo objeto array annimo que armazena
os trs inteiros 22, 33, 44 a a[3].

a[0]
a[1]
a[2]
a[3]

=
=
=
=

new java.util.Date();
"ABCDE";
new java.util.Random();
new int[] {22,33,44};

Date

"ABCDE"

String

3
4
Random
Object[]

0 22
1 33
2 44
int[]

FJN | SI | LP2

PROF. SIDNEY

43

Exerccio: Array de Objetos


Na linha 8, nosso mtodo print() imprime o array a[]. Isto faz
com que o mtodo toString() de cada objeto seja invocado na
linha 13. Para o objeto Date em a[0], o mtodo toString()
retorna o string " Tue Apr 14 17:50:04 BRT 2009 ", que mostra
o momento no qual o objeto Date foi instanciado. Para o objeto
String em a[1], o mtodo toString() simplesmente retorna o
string "ABCDE" que o objeto contm.
print(a);

Date

"ABCDE"

private static void print(Object[] a) {


for (int i=0; i<a.length; i++)
System.out.println(i+". "+a[i]);
System.out.println();
}

String

3
4
Random
Object[]

0 22
1 33
2 44
int[]

FJN | SI | LP2

PROF. SIDNEY

44

Exerccio: Array de Objetos


O mtodo toString() no diretamente implementado pela
classe Random, e assim, para a[2], o mtodo default toString()
(da classe Object) invocado na linha 13 retornando a forma
genrica java.util.Random@190d11, que mostra o tipo de
ojbeto e o seu endereo de memria. A mesma coisa ocorre
com a[3]. Note que o quinto elemento, a[4], foi alocado mas
no inicializado. Consequentemente,
seu valor null.
Date
a

0
1

print(a);

"ABCDE"

String

private static void print(Object[] a) {


for (int i=0; i<a.length; i++)
System.out.println(i+". "+a[i]);
System.out.println();
}
FJN | SI | LP2

PROF. SIDNEY

4
Random
Object[]

0 22
1 33
2 44
int[]

45

A Classe java.
java.util.Arrays
Java inclui uma classe "utilitria" especial para processamento
de arrays. O nome desta classe Arrays; ela est definida no
pacote java.util.
O prximo programa ilustra os mtodos sort(),
binarySearch(), fill(), e equals() da classe
java.util.Arrays.

FJN | SI | LP2

PROF. SIDNEY

46

Exerccio: Usando a classe java


java..util.Arrays
1 import java.util.Arrays;
2
3 public class TestArrays3 {
4

public static void main(String[] args) {

int[] a = {44, 77, 55, 22, 99, 88, 33, 66};

print(a);

Arrays.sort(a);

print(a);

int k = Arrays.binarySearch(a, 44);

10

System.out.println("Arrays.binarySearch(a,44): "+k);

11

System.out.println("a["+k+"]:"+a[k]);

12

k = Arrays.binarySearch(a,45);

13

System.out.println("Arrays.binarySearch(a,45): "+k);

continua >>
FJN | SI | LP2

PROF. SIDNEY

47

Exerccio: Usando a classe java


java..util.Arrays
continuao >>
14

int[] b = new int[8];

15

print(b);

16

Arrays.fill(b, 55);

17

print(b);

18

System.out.println("Arrays.equals(a,b): "+Arrays.equals(a,b));

19 }
20
21

public static void print(int[] a) {

22

for (int i = 0; i < a.length; i++)

23

System.out.print(a[i]+" ");

24
25

System.out.println();
}

26 }
FJN | SI | LP2

PROF. SIDNEY

48

Exerccio: usando a classe java


java..util.Arrays
O array a[] criado e impresso nas linhas 5-6. Na linha 7, a
chamada Arrays.sort(a) ordena os elementos do array,
colocando-os em ordem ascendente, como podemos ver na
sada da linha 8.
Na linha 9, o mtodo Arrays.binarySearch() invocado. O
segundo argumento, 44, o alvo da pesquisa. O mtodo
retorna o ndice 2, que atribudo a k na linha 9. A linha 11
confirma que 44 ainda o valor de a[2].

FJN | SI | LP2

PROF. SIDNEY

49

Exerccio: usando a classe java


java..util.Arrays
O mtodo invocado novamente na linha 13, desta vez
procurando pelo alvo 45. O valor no encontrado no array, e
assim o mtodo retorna um nmero negativo, k=-4. Quando
isso acontece, o ndice i=-k-1 ser a posio do array onde o
elemento alvo deveria ser inserido para manter a ordem
crescente do array. Note que, neste caso, i=-k-1=3, e 45
deveria ser inserido em a[3] uma vez que existem 3 elementos
do array que so menores do que 45.
As linhas 16-17 mostram como o mtodo Arrays.fill() funciona:
ele preenche o array de 8 elementos b[] com o argumento 55.
Finalmente, a linha 18 mostra como o mtodo Arrays.equals()
funciona. Ele vai retornar verdadeiro somente se dois arrays
possuem o mesmo tipo de elementos, o mesmo tamanho e os
mesmos valores em cada elemento.
FJN | SI | LP2

PROF. SIDNEY

50

Exerccio: usando a classe java


java..util.Arrays
A sada:
44 77 55 22 99 88 33 66
22 33 44 55 66 77 88 99
Arrays.binarySearch(a,44): 2
a[2]:44
Arrays.binarySearch(a,45): -4
00000000
55 55 55 55 55 55 55 55
Arrays.equals(a,b): false

FJN | SI | LP2

PROF. SIDNEY

51

Exerccio: Outra Classe Arrays


1 import java.util.Random;
2
3 public class IntArrays {
4

private static Random random = new Random();

5
6

public static boolean isSorted(int[] a) {

// retorna false a menos que a[0] <= a[1] <= a[2] <= ...

for (int i = 1; i < a.length; i++)

if (a[i]<a[i-1]) return false;

10
11

return true;
}

12

continua >>
FJN | SI | LP2

PROF. SIDNEY

52

Exerccio: Outra Classe Arrays


continuao >>
13

public static void print(int[] a) {

14

// imprime os elementos do array especificado em sequencia.

15

if (a==null||a.length==0) return;

16

System.out.print("{"+a[0]);

17

for (int i = 1; i < a.length; i++)

18

System.out.print(","+a[i]);

19
20

System.out.println("}");
}

21

continua >>
FJN | SI | LP2

PROF. SIDNEY

53

Exerccio: Outra Classe Arrays


continuao >>
22 public static int[] randomIntArray(int length, int range) {
23

// retorna novo array int, do tamanho definido, cujos elementos

24

// esto randomicamente distribudos no intervalo 0 a range-1:

25

int[] a = new int[length];

26

for (int i = 0; i < a.length; i++)

27

a[i] = random.nextInt(range);

28

return a;

29 }
30

continua >>
FJN | SI | LP2

PROF. SIDNEY

54

Exerccio: Outra Classe Arrays


continuao >>
31

public static int[] resized(int[] a, int length) {

32

// retorna um novo array com o tamanho especificado

33

// contendo os mesmos elementos que o array especificado:

34

int[] aa = new int[length];

35

int n = Math.min(a.length, length);

36

System.arraycopy(a, 0, aa, 0, n);

37

return aa;

38 }
39

continua >>
FJN | SI | LP2

PROF. SIDNEY

55

Exerccio: Outra Classe Arrays


continuao >>
40 public static void swap(int[] a, int i, int j) {
41

// permuta os elementos a[i] e a[j];

42

int ai=a[i], aj=a[j];

43

a[i]=aj;

44

a[j]=ai;

45

46 }

FJN | SI | LP2

PROF. SIDNEY

56

Exerccio: Outra Classe Arrays


1 import java.util.Arrays;
2
3 public class TestIntArrays {
4

public static void main(String[] args) {

int[] a = IntArrays.randomIntArray(8, 100);

IntArrays.print(a);

System.out.println("IntArrays.isSorted(a): "+IntArrays.isSorted(a));

Arrays.sort(a);

IntArrays.print(a);

10

System.out.println("IntArrays.isSorted(a): "+IntArrays.isSorted(a));

11

IntArrays.swap(a, 2, 4);

12

IntArrays.print(a);

13

System.out.println("IntArrays.isSorted(a): "+IntArrays.isSorted(a));

continua >>
FJN | SI | LP2

PROF. SIDNEY

57

Exerccio: Outra Classe Arrays


continuao >>
14

a = IntArrays.resized(a, 10);

15

IntArrays.print(a);

16

a = IntArrays.resized(a, 5);

17

IntArrays.print(a);

18

19 }

FJN | SI | LP2

PROF. SIDNEY

58

Exerccio: Outra Classe Arrays


A sada:
{98,1,37,98,83,70,74,95}
IntArrays.isSorted(a): false
{1,37,70,74,83,95,98,98}
IntArrays.isSorted(a): true
{1,37,83,74,70,95,98,98}
IntArrays.isSorted(a): false
{1,37,83,74,70,95,98,98,0,0}
{1,37,83,74,70}

FJN | SI | LP2

PROF. SIDNEY

59

Exerccio: Outra Classe Arrays


O programa de teste usa a classe java.util.Arrays e a nossa
prpria classe IntArrays. O array a[] inicializado na linha 5 com
nmeros randmicos {98,1,37,98,83,70,74,95}. A chamada a
sort() na linha 8 transforma a[] em {1,37,70,74,83,95,98,98}.
O mtodo isSorted() retorna false na primeira chamada (linha 7),
mas retorna true na segunda (linha 10), aps a chamada ao
mtodo sort() (que feita na linha 8). A terceira chamada ao
mtodo isSorted() retorna false (linha 13), pois ela acontece aps
a chamada ao mtodo swap() (linha 11), que troca elementos de
posio.
Finalmente, nas linhas 14 e 16, testamos o mtodo resized(). Na
linha 14, ele expande o array, adicionando dois 0s no final. Na
linha 16, ele trunca o array, eliminando todos os seus elementos,
exceto os 5 primeiros.

FJN | SI | LP2

PROF. SIDNEY

60

Questes de Reviso
1.
2.
3.
4.
5.
6.

Como a determinao do tamanho de um array de


caracteres se diferencia da determinao do tamanho de
um objeto String?
O que acontece se voc usa w[5] em uma expresso aps
alocar 5 elementos para o array?
Qual a diferena entre um array null e um array de
tamanho zero?
Por que arrays so geralmente processados com laos for?
Por que um array Objetct[] chamado de array universal?
Pode um array armazenar elementos de diferentes tipos?

FJN | SI | LP2

PROF. SIDNEY

61

Exerccio: Criando uma janela


continuao >>
13

public static void main(String[] args) {

14

JFrame janela = new CriaJanela();

15

janela.setVisible(true);

16

// rotina para fechar a janela:

17

janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18

19 }

FJN | SI | LP2

PROF. SIDNEY

62