Arrays
- Um array é uma coleção ordenada de dados do mesmo tipo
- Representa diversos valores do mesmo tipo organizados sequencialmente
- Cada elemento do array pode ser acessado por meio de um índice
public class ExemploArray01 {
public static void main(String[] args) {
// Tipo da variável Nome da variável = Valor da variável
int[] numeros; // Declaração de um array de inteiros
numeros = new int[10]; // Criação do array
for (int i = 0; i < numeros.length; i++) {
numeros[i] = i+1;
System.out.print(numeros[i]+"\t");
}
}
}
Resultado da execução:
1 2 3 4 5 6 7 8 9 10
Características dos Arrays:
- O tamanho é fixo e não pode ser alterado após a criação
- Todos os elementos devem ser do mesmo tipo
- Pode conter qualquer tipo de dado, incluindo tipos primitivos e referências
- As variáveis que referenciam arrays são do tipo referência, sendo os próprios arrays objetos armazenados na memória heap do Java, portanto o objeto array reside na heap
O comprimento de um array é obtido com array.length, então o maior índice válido é array.length-1; tentar acessar além disso resultará em uma exceção: ArrayIndexOutOfBoundsException
Uso de Arrays
exemplo04
- Laços for tradicionais
- Laços for-each
- Passagem de arrays como parâmetros
- Retorno de arrays de métodos
public class ExemploArray04 {
public static void main(String[] args) {
// Declaração de um array
int[] arrays = {1, 3, 4, 5, 6,};
// JDK 1.5 sem uso de índices
// Loop for-each
for (int array : arrays) {
System.out.println(array);
}
// Chamada de métodos
imprimirArray(arrays);
int[] invertido = inverterArray(arrays);
imprimirArray(invertido);
}
// Passagem de array como parâmetro
public static void imprimirArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
}
// Retorno de array de método
public static int[] inverterArray(int[] arrays) {
int[] resultado = new int[arrays.length];
// Operação de inversão
for (int i = 0, j = resultado.length - 1; i < arrays.length; i++, j--) {
resultado[j] = arrays[i];
}
return resultado;
}
}
Resultado da execução:
1 3 4 5 6
===============================
1 3 4 5 6
===============================
6 5 4 3 1
Arrays Multidimensionais
public class ExemploArray05 {
public static void main(String[] args) {
int[][] arrays = {{1}, {3,2,3,5}, {4, 5, 6}};
for (int[] array : arrays) {
for (int i : array) {
System.out.print(i + " ");
}
}
}
}
Ordenação por Bolha (Bubble Sort)
A ordenação por bolha é uma das técnicas de ordenação mais conhecidas, sendo uma das oito principais formas de ordenar dados.
public class ExemploArray07 {
public static void main(String[] args) {
// Ordenação por bolha: compara elementos adjacentes de um array e troca se necessário.
// A cada iteração, um elemento máximo ou mínimo é colocado corretamente.
// Reduz o número de comparações nas próximas iterações!
// Um ciclo completo até a conclusão!
int[] a = {6,3,6776,434,221,2,3,};
int[] b = ordenar(a);
System.out.println(Arrays.toString(b));
}
public static int[] ordenar(int[] array){
int temp;
// Loop externo, determinando quantas iterações serão feitas
for (int i = 0; i < array.length-1; i++) {
// Otimização
boolean sinalizador = false;
// Verificação de ordem
for (int j = 0; j < array.length-1-i; j++) {
/*
Se a condição for: array[j]>array[j+1], os maiores valores irão para o final
Se a condição for: array[j+1]>array[j], os menores valores irão para o final
*/
if(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
sinalizador = true;
}
}
if(!sinalizador){
break;
}
}
return array;
}
}
Resultado da execução:
[2, 3, 3, 6, 221, 434, 6776]
Arrays Esparsos
- Quando um array possui muitos elementos iguais a zero ou a um único valor, pode-se utiilzar uma representação esparsa.
- O tratamento de arrays esparsos envolve:
- Registrar o número de linhas e colunas e o total de elementos distintos
- Armazenar em uma estrutura menor os índices e valores dos elementos diferentes de zero
public class ExemploArray08 {
public static void main(String[] args) {
// Criar um array bidimensional 11x11 0:sem peça 1:peça preta 2:peça branca
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
System.out.println("Imprimir array original");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
System.out.println("=========================================");
System.out.println("Criar array esparsa");
// Contar elementos não-zero
int soma = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
soma++;
}
}
}
System.out.println("soma:" + soma);
// Criar array esparsa
int[][] array2 = new int[soma + 1][3];
array2[0][0] = 11; // Número de linhas do array original
array2[0][1] = 11; // Número de colunas do array original
array2[0][2] = soma;
int contador = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
contador++;
array2[contador][0] = i;
array2[contador][1] = j;
array2[contador][2] = array1[i][j];
}
}
}
System.out.println("Imprimir array esparsa");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1]+"\t" + array2[i][2]);
}
System.out.println("================================");
System.out.println("Restaurar array original a partir do esparsa");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i <array2.length ; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
// Imprimir array restaurado
for (int i = 0; i < array3.length; i++) {
for (int j = 0; j < array3[i].length; j++) {
System.out.print(array3[i][j] + "\t");
}
System.out.println();
}
}
}
Imprimir array original
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
=========================================
Criar array esparsa
soma:2
Imprimir array esparsa
11 11 2
1 2 1
2 3 2
================================
Restaurar array original a partir do esparsa
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0