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

5 respostas
E

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

5 Respostas

E

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

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?
  }
}
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

TerraSkilll
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:
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 + "]");
    	}
    }

Abraço.

E

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

TerraSkilll
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:
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!!!!!

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

Abraço.

E

Olá TerraSkilll,

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

Abs.
Edjane

Criado 1 de setembro de 2012
Ultima resposta 3 de set. de 2012
Respostas 5
Participantes 2