Matrices: ¿se pueden asignar?

Iniciado por reygecko, 27 Diciembre 2012, 14:18 PM

0 Miembros y 2 Visitantes están viendo este tema.

reygecko

Seguramente estoy preguntando una tontería, pero he googleado en busca de respuestas y no he encontrado nada, así que ahí va mi pregunta:

¿Es posible duplicar una matriz bidimensional mediante una asignación (por ejemplo, del tipo matriz1 = matriz2) o es necesario copiar uno a uno todos sus valores de una matriz a otra?

No sé si queda claro lo que estoy preguntando, espero que sí. 

Valkyr

Puedes probarlo tú mismo, haz la prueba y mira a ver qué pasa  ;)

reygecko

Bueno, eso ya lo había intentado.  Pero tengo este error:



Uploaded with ImageShack.us


Oblivi0n

Respecto a la pregunta : cuando tienes una matriz (p.e: int matriz[][]) simplemente tu puedes hacer int matriz2[][] = matriz. De este modo NO ESTAS DUPLICANDO LA MATRIZ, sino que le estás asignando una referencia, es decir, las 2 variables apuntarían a la misma matriz.

Respecto a la imagen, el error que te da porque pones los [][], esos corchetes solo se ponen para que dentro pongas números, que sirven para indicar el desplazamiento que se le ha de aplicar a la direccion base de la variable.

En definitiva, si quieres duplicar una matriz, basta con crear otra del mismo tipo (int matriz2[][] por ejemplo) y recorrer la original asignando cada valor a la nueva

reygecko

Muchas gracias por tu ayuda y por el detalle de tu explicación, Oblivi0n.  Ahora entiendo todo mucho mejor. :)

¿Serías, por favor, tan amable de explicarme qué significa o qué consecuencias tendría el nuevo error/aviso que me aparece al aplicar el consejo que me has dado?  (Por si te sirve de orientación, pretendo que la matriz introducida por referencia modifique a la matriz declarada en la clase "Tablero", creo que he seguido bien tus indicaciones)

Te adjunto la captura:



P.D.- Siento si alguien piensa que mis preguntas son estúpidas, pero estoy aprendiendo por mí mismo y me suelo atascar en cosas que (seguro) son muy sencillas.  Siempre busco una respuesta en Google antes de preguntar, pero no siempre la encuentro.  Gracias de nuevo a todos quienes ayudáis desinteresadamente a los novatos como yo.

1mpuls0

#5
Hola.

Es muy importante lo que dice Oblivi0n.

Citar
De este modo NO ESTAS DUPLICANDO LA MATRIZ, sino que le estás asignando una referencia, es decir, las 2 variables apuntarían a la misma matriz.

Mira el siguiente ejemplo.

Código (java) [Seleccionar]

public class TestArray {
   
   public static void main(String[] args) {
    new TestArray();
   }
   
   public TestArray() {
    int array1[]={1,2,3};
    int array2[]=new int[array1.length];
   
    array2=array1;
   
    System.out.println("array1[0]: "+array1[0]);
    System.out.println("array2[0]: "+array2[0]);
    array1[0]=4; //Modificar el indice 0 de array1
    System.out.println("array1[0]: "+array1[0]);
    System.out.println("array2[0]: "+array2[0]);
   }
}


Lo mejor sería copiar los elementos del arreglo. Para esto hay dos formas.

Tomando como ejemplo un arreglo unidimensional.

Código (java) [Seleccionar]

//Método 1
for (int x=0;x<array1.length;x++)
  array2[x] = array1[x];

//Método 2
System.arraycopy(array1,0,array2,0,array1.length);


Saludos.
abc

reygecko

Gracias por el ejemplo, Darhius.  Entre la explicación de Oblivi0n y tus ejemplos, ahora lo entiendo perfectamente.

Muchas gracias a todos.  ;-)

Oblivi0n

Ya que queda explicado el problema, como última puntilla, el error que te dá es porque estas llamando igual a una variable local que a un atributo de clase (las variables de arriba del todo vamos).

Recuerda que las variables siempre deben de tener nombres diferentes de los atributos, es decir:

Imagina que tienes n atributos ( puedes llamarlas fields en ingles o variables de clase ), que se llamana atributo1,atributo2,...,atributon
en ningún metodo de esa clase puedes volver a utilizar ese nombre, porque ese es global a la clase.

Sin embargo, si yo tengo un metodo, por ejemplo la suma
Código (java) [Seleccionar]

int suma(int x, int y){
return x+y;
}


nadie te quitara de utilizar esos mismos nombres en otro metodo, por ejemplo:

Código (java) [Seleccionar]

int resta(int x, int y){
return x-y;
}



Dado que estos nombres son locales, es decir, una vez "muerto" el metodo, esos nombres desaparecen, al contrario que en los atributos de clase, que permanecen durante todo el tiempo de ejecución de la clase.

Y finalmente, perdón por la chapa que doy xD

reygecko

No me pidas perdón por explicarme las cosas, ¡¡faltaría más!!  :D

No sé si seré capaz de terminar a tiempo el proyecto que estoy haciendo, pero al menos esto está despertando mi curiosidad por Java.  Y eso es por la gente que me está ayudando, así que en serio, muchas gracias, aprendo con cada cosa que leo por aquí. 

Un saludete.