Questão CertPal - Array tridimensional.... [RESOLVIDO]

Olá pessoas,

Estava respondendo o simulado no site CertPal e me deparei com a seguinte questão:

public class Cert   
{  
    public static void main(String[] args)  
    {  
        int []ant = new int[4];  
        int []pant[]= new int[4][4];  
        int [][] cant []= new int[4][4][4];  
        ant[0] = 10; ant[1] = 15;  
        pant[0] = ant;  
        cant[0] = pant;  
        System.out.println(cant[0][0][1]);  
    }  
} 

O resultado dessa questão é 15! Mas não consigo entender como isso funciona! Se alguém poder me ajudar ficarei muito grata.

Att.
Edjane

Bem pessoal, apesar de ainda não ter obtido respostas, estou quase entendendo essa questão! Segue novo código comentado:

[code]package br.com.certpal;

public class Teste {
public static void main(String[] args) {
int [] ant = new int[]{1,2,3,4};
int [] pant[]= new int[][] {{12},{13}};
int cant [] [][]= new int [][][] {{{22,23,24,24,25},{222,223,223,224,225},{2222,2223,2223,2224,2225}}};

cant [0] [1] [3] = 22; //Aqui posso atribuir novo valor! Agora olhem a última linha de comando!
System.out.println(cant [0] [1] [3]);//ok imprime 22
System.out.println(ant[0]);//ok imprime 1
System.out.println(ant[1]);//ok imprime 2
System.out.println(cant[0][0][0]); //ok imprime 22

ant[0] = 10; ant[1] = 15; ant[2]=30;  //defino novos valores para ant[]
System.out.println(ant[0]);//ok imprime 10

pant[0] = ant; //informo que meu pant[0] recebe valor de ant; 
System.out.println(pant[1][0]);//imprime 13, valor no array
System.out.println(pant[0][1]);//imprime 15, valor herdado de ant[1]

cant[0] = pant;  //informo que meu cant[0] recebe valor de pant; 

System.out.println(cant[0][0][2]);  //imprime 30, valor herdado de ant[2]
cant [0] [0] [3] = 20; //informo que meu cant [0] [0] [3] recebe 20;
System.out.println(cant[0][0][3]); //ok imprime 20
cant [0] [1] [3] = 2020; //porque não posso atribuir um novo valor aqui?

}
}[/code]
Agora não consigo entender porque não posso atribuir um novo valor na linha 27! No restante o que entendi, mas não sei se estou correta é que como o valor de ant é um array unidimensional, os próximos arrays multidimensionais que herdarem dele, sempre recebem o valor dele na “última dimensão”!

Att.
Edjane

cant [0] [1] [3] = 2020; //porque não posso atribuir um novo valor aqui?  

Porque a posição cant [0] [1], que é um array, não tem a posição 3, somente a posição 0.

Ou seja:

cant[0][1][0] = 10; // ok, a posição 0 existe; cant[0][1][1] = 10; // erro, a posição 1 não existe; cant[0][1][2] = 10; // erro, a posição 2 não existe;

O erro é ArrayIndexOutOfBoundsException. Note que, em Java, arrays de arrays podem ter tamanhos variáveis. Por isso é importante checar o tamanho dos arrays com length antes de atribuir valores a eles.

Exemplo:

[code] int matriz[][] = new int[3][];
matriz[0] = new int[2];// a posição 0 da matriz é um array de 2 posições
matriz[1] = new int[10];// a posição 1 da matriz é um array de 10 posições
matriz[2] = new int[5];// a posição 2 da matriz é um array de 5 posições

for (int x = 0; x < matriz.length; x++){
	for(int y=0; y<matriz[x].length; y++){
		System.out.println("Matriz[" + x + "][" + y + "]");
	}
}[/code]

Abraço.

Olá TerraSkilll,
Então o que acontece é que quando passo:

cant[0] = pant;

Nesse caso estou transformando meu array tridimensional em um dimensional?
e por já ter informado que:

pant[0] = ant;

Esse Cant, consequentemente vira um unidimensional?
Seria essa a lógica?

Abs.
Edjane

Mais ou menos isso. Perceba que a coisa vem desde o começo. Como cant[0] recebe pant, e pant na posição 1 só tem uma posição, cant[0][1] passa a ter somente uma posição também. Note que cant[0][1] perde tamanho, ou seja, passa de tamanho 5 para 1. Exemplo:

[code]int [] ant = new int[]{1,2,3,4};
int [] pant[]= new int[][] {{12},{13}};
int cant [] [][]= new int [][][] {{{22,23,24,24,25},{222,223,223,224,225},{2222,2223,2223,2224,2225}}};

cant [0] [1] [3] = 22; //Aqui, cant[0][1] AINDA NÃO MUDOU de tamanho

ant[0] = 10; ant[1] = 15; ant[2]=30; //defino novos valores para ant[]

pant[0] = ant;
// na linha acima temos uma mudança no tamanho da posição 0 de ant:
// ela passa a ter tamanho 4, que é o tamanho de ant
// mas a posição pant[1] continua com tamanho 1 (e valor 13)

cant[0] = pant;
// na linha acima, a posição 0 de cant recebe pant.
// E qual é o tamanho de pant? 4 na posição 0, mas 1 na posição 1,
// ou seja, o tamanho de cant[0] é alterado

// Para confirmar, fazemos:
System.out.println("Tamanho pant[0]: " + pant[0].length); // vai exibir “Tamanho pant[0]: 4”
System.out.println("Tamanho pant[1]: " + pant[1].length); // vai exibir “Tamanho pant[1]: 1”

cant [0] [0] [3] = 20; //informo que meu cant [0] [0] [3] recebe 20;

System.out.println(“Tamanho cant[0][1]:” + cant[0][1].length);

cant [0] [1] [3] = 2020; //ArrayIndexOutOfBoundsException!!! [/code]

Nota: suprimi os System.out pra facilitar o entendimento. Se eu não errei alguma conta, é isso aí que ocorre.

Abraço.

Olá TerraSkilll,

Fiquei um bom tempo tentando entender essa questão! Graças a sua ajuda consegui entender! Muito obrigada!

Abs.
Edjane