Detalhes sobre atribuição de referências para outro Array

7 respostas
rafadelnero

Bom dia!

Ontem me estava fazendo simulado para a prova de certificação Java e me deparei com uma questão de atribuição de referências de array para outro, tem uma lógica, eu absorvi essa lógica porém não ficou totalmente claro, procurei pela internet pra ver se tinha algo do tipo, mas a dúvida é muito específica por isso é difícil de encontrar, aí pensei em postar aqui pra ver se alguém sabe me explicar pelo seguinte exemplo:

public class TesteArray {
	public static void main(String[] args) {
		int[][] array1 = new int[] [] {{1,2}, {1, 2}};
		
		int [][][] array2 = new int [][][] {{{1,2,2}}, {{1, 2}}};
		// Aqui está a minha dúvida, percebi que a referência do array está sendo atribuída mas não entendi muito bem
                // do porque de o Array estar com o índice 0, percebi também que o array está passando 2 dimensões para o array1
                // mas eu gostaria de esclarecer esse conceito
		array1 = array2[0]; 
	}
}

Obrigado!

7 Respostas

R

O array1 tem 2 dimensões, portanto é um array de arrays.

O array2 tem 3 dimensões, portanto é um array de arrays de arrays.

Quando você acessa o primeiro elemento do array2 (array2[0]), ele é um array de arrays, ou uma estrutura de 2 dimensões, igual ao array1. Assim, tendo a mesma “estrutura”, é possível fazer a atribuição ( array1 = array2[0] ).

Espero ter esclarecido mais do que confundido!

Abç.

rafadelnero

rt:
O array1 tem 2 dimensões, portanto é um array de arrays.

O array2 tem 3 dimensões, portanto é um array de arrays de arrays.

Quando você acessa o primeiro elemento do array2 (array2[0]), ele é um array de arrays, ou uma estrutura de 2 dimensões, igual ao array1. Assim, tendo a mesma “estrutura”, é possível fazer a atribuição ( array1 = array2[0] ).

Espero ter esclarecido mais do que confundido!

Abç.

Ajudou sim rt, obrigado! Mas não ficou claro o índice do Array do porquê de ser 0!

Rodrigo_Sasaki

Não tem que ser 0, pode ser qualquer índice válido no primeiro array.

Imagine um daqueles cubos de Rubik

Ele é tridimensional, tem a base de 3 cubos, a largura de 3 cubos e altura de 3 cubos. Um array que representa ele, seria assim:int[][][] cubo = new int[3][3][3]; Sendo que cubo[0][0][0] é uma das pontas do cubo.

Vamos supor que você quer separar ele em três, a fatia da base, a fatia do meio e a fatia do topo, em 3 arrays diferentes, para poder manipular melhor, aí faz assim:int[][] base = cubo[0]; int[][] meio = cubo[1]; int[][] topo = cubo[2];Pronto, agora você tem as 3 fatias.

Se quiser dividir a base em 3 partes: esquerda, meio e direita, faz assim:int[] baseEsquerda = base[0]; int[] baseMeio = base[1]; int[] baseDireita = base[2];E agora você tem a base dividida em 3 partes, cada uma sendo um array de 3 espaços.

Fez mais sentido?

rafadelnero

Não tem que ser 0, pode ser qualquer índice válido no primeiro array.

Imagine um daqueles cubos de Rubik

Ele é tridimensional, tem a base de 3 cubos, a largura de 3 cubos e altura de 3 cubos. Um array que representa ele, seria assim:int[][][] cubo = new int[3][3][3]; Sendo que cubo[0][0][0] é uma das pontas do cubo.

Vamos supor que você quer separar ele em três, a fatia da base, a fatia do meio e a fatia do topo, em 3 arrays diferentes, para poder manipular melhor, aí faz assim:int[][] base = cubo[0]; int[][] meio = cubo[1]; int[][] topo = cubo[2];Pronto, agora você tem as 3 fatias.

Se quiser dividir a base em 3 partes: esquerda, meio e direita, faz assim:int[] baseEsquerda = base[0]; int[] baseMeio = base[1]; int[] baseDireita = base[2];E agora você tem a base dividida em 3 partes, cada uma sendo um array de 3 espaços.

Fez mais sentido?

Fez sim Rodrigo Sazaki, obrigado pelo esclarecimento, só não ficou muito claro a parte que um array com a declaração de duas dimensões recebendo o array de três dimensões mas com apenas um colchete de dimensão.

int[][] base = cubo[0];
Rodrigo_Sasaki

Acontece que cada índice do array tridimensional representa um array bidimensional. então no caso do cubo você tem 3 arrays bidimensionais.

Vamos supor que você quer separar uma face do cubo:
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------

Isso represena um dos 3 arrays do cubo. Imagina que atrás dessa face ainda existem 2 do mesmo tamanho, eu não consigo desenhar isso :)

então cubo[0] tem essa cara, que é um array de arrays, uma matriz. Então:

cubo[0] é uma matriz
cubo[1] é uma matriz
cubo[2] é uma matriz.

Como estamos falando de um array bidimensional, cubo[0] só pode ser atribuído a um array bidimensional, por isso a atribuição fica desse jeito.

Eu sei que pra entender isso pode ser necessário um pouco de imaginação, tente visualizar o cubo e seus índices, talvez te ajude

rafadelnero
Rodrigo Sasaki:
Acontece que cada índice do array tridimensional representa um array bidimensional. então no caso do cubo você tem 3 arrays bidimensionais. Vamos supor que você quer separar uma face do cubo:
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------
|        |        |        |
|   0    |   1    |   2    |
|        |        |        |
----------------------------

Isso represena um dos 3 arrays do cubo. Imagina que atrás dessa face ainda existem 2 do mesmo tamanho, eu não consigo desenhar isso :)

então cubo[0] tem essa cara, que é um array de arrays, uma matriz. Então:

cubo[0] é uma matriz
cubo[1] é uma matriz
cubo[2] é uma matriz.

Como estamos falando de um array bidimensional, cubo[0] só pode ser atribuído a um array bidimensional, por isso a atribuição fica desse jeito.

Eu sei que pra entender isso pode ser necessário um pouco de imaginação, tente visualizar o cubo e seus índices, talvez te ajude

Muito obrigado Rodrigo Sasaki, agora entendi perfeitamente! E por exemplo :

cubo[0]; // Representa um array de duas dimensões 
cubo[0][0]; // representa um array de uma dimensão no qual posso atribuir para outro array de uma dimensão.
cubo; // E assim cubo representa o cubo inteiro com 3 dimensões
Rodrigo_Sasaki

rafadelnero:
Muito obrigado Rodrigo Sasaki, agora entendi perfeitamente! E por exemplo :

cubo[0]; // Representa um array de duas dimensões cubo[0][0]; // representa um array de uma dimensão no qual posso atribuir para outro array de uma dimensão. cubo; // E assim cubo representa o cubo inteiro com 3 dimensões


Exato, é isso aí mesmo :slight_smile:

Criado 2 de setembro de 2013
Ultima resposta 5 de set. de 2013
Respostas 7
Participantes 3