Matrizes Multidimensionais
Arrays são objetos e, claro, componentes de array podem ser objetos. Não demorou muito tempo, misturando esses dois fatos, para saber se matrizes podem conter outras matrizes, e claro que eles podem.
Criando uma matriz multidimensional
Vários separadores de matriz são o suficiente para declarar matrizes com várias dimensões. Você pode localizá-los com o tipo ou nome da variável na declaração, assim como antes:
int[][] vars1; // 2D
array int vars2 [][]; // 2D
array int[] vars3[]; // 2D
array int[] vars4 [], space [][]; // a 2D AND a 3D array
Os dois primeiros exemplos não são nada surpreendentes e declaram um array bidimensional (2D). O terceiro exemplo também declara um array 2D. Não há boas razões para usar este estilo do que confundir os leitores do seu código. O último exemplo declara duas matrizes na mesma linha. Somando os colchetes, vemos que o vars4 é um array 2D e space é um array 3D.
Novamente, não há razão para usar esse estilo além de confundir os leitores do seu código. No entanto, os criadores de testes gostam de confundir você. Felizmente você está ligado a eles e não vai deixar isso acontecer com você!
Você pode especificar o tamanho de sua matriz multidimensional na declaração, se desejar:
String [][] rectangle = new String[3][2];
O resultado desta declaração é um retângulo de matriz com três elementos, cada um dos quais refere-se a uma matriz de dois elementos. Você pode pensar no intervalo endereçável como [0] [0] até [2] [1], mas não pense nisso como uma estrutura de endereços como [0,0] ou [2,1].
Agora suponha que definimos um desses valores:
rectangle[0][1] = "set";
Você pode visualizar o resultado conforme mostrado na Figura 3.6. Esta matriz é pouco povoada porque tem muitos valores nulos. Você pode ver que o retângulo ainda aponta para uma matriz de três elementos e que temos três matrizes de dois elementos. Você também pode seguir a trilha de referência para o valor que aponta para uma String. Primeiro você começa no índice 0 no array do topo. Então você vai para o índice 1 na próxima matriz.
Embora essa matriz seja de forma retangular, uma matriz não precisa ser.
Considere este aqui:
int[][] differentSize = {{1, 4}, {3}, {9,8,7}};
Ainda começamos com uma matriz de três elementos. No entanto, desta vez os elementos no próximo nível são todos de tamanhos diferentes. Um é de comprimento 2, o comprimento seguinte 1 e o último comprimento 3 (veja a Figura 3.7). Desta vez, a matriz é de primitivos, então eles são mostrados como se estivessem no array.
Outra maneira de criar uma matriz assimétrica é inicializar apenas a primeira dimensão de uma matriz, e defina o tamanho de cada componente da matriz em uma instrução separada:
int [][] args = new int[4][];
args[0] = new int[5];
args[1] = new int[3];
Essa técnica revela o que você realmente obtém com o Java: arrays de arrays que, apropriadamente gerenciados, oferecem um efeito multidimensional.
Usando uma matriz multidimensional
A operação mais comum em um array multidimensional é percorrê-lo. Este exemplo imprime uma matriz 2D:
int[][] twoD = new int[3][2];
for (int i = 0; i < twoD.length; i++) {
for (int j = 0; j < twoD[i].length; j++)
System.out.print(twoD[i][j] + " "); // print element
System.out.println(); // time for a new row
}
Nós temos dois loops aqui. O primeiro usa o índice i e passa pelo primeiro subarray para twoD. O segundo usa uma variável de loop diferente j . É muito importante que estes tenham diferentes nomes de variáveis para que os loops não se misturem. O laço interno analisa quantos elementos estão no array de segundo nível. O loop interno imprime o elemento e deixa um espaço para melhor legibilidade. Quando o loop interno é concluído, o loop externo vai para uma nova linha e repete o loop para o próximo elemento.
Todo este exercício seria mais fácil de ler com o loop for aprimorado.
for (int[] inner : twoD) {
for (int num : inner)
System.out.print(num + " ");
System.out.println();
}
Garantiremos a você que não são menos linhas, mas cada linha é menos complexa e não há variáveis de loop ou condições de terminação para mixar.