Ayuda con copiar matrices

Amaia
25 de Abril del 2006
Hola!!
Tengo un problema. Tengo dos clases, arrayak y frame, en el frame hay dos
matrices y quiero hacer un metodo copiar matrices y no se como hacerlo.
Cada matriz es de 9x9 y cada casilla es de clase arrayak, que tiene un array y un
boolean. Quiero hacer un metodo copiar en arrayak que copie el array y el
boolean, y luego en el frame copiar mediante dos fors.

public class Arrayak
{
private boolean array[];
public boolean jarrita;

public Arrayak(boolean args[])
{
jarrita= false;
array= new boolean[9];
}
public void hasieratu()
{
for(int i=0;i<=8;i++)
{
array[i]= false;
}
}
public void esleitu(int i)
{
array[i]= true;
}
public void inprimitu()
{
for (int i=0;i<=8;i++)
{
System.out.println(array[i]);
}
}
public boolean badago(int o)
{
if (array[o]==true)
{
return true;
}
else
{
return false;
}
}

public void ezabatu(int i)
{
array[i]= false;
}

public void true_jarri()
{
for(int i=0;i<=8;i++)
{
array[i]= true;
}
}
public void copiar(??????????????????????)
{
for(int i=0;i<=8;i++)
{
array[i]=arraykop[i];
}
jarrita=??????????????

}
}
class frame
{
static Arrayak matrize[][];
Arrayak matrize_kopia[][];
........
matrize= new Arrayak [9][9];
matrize_kopia= new Arrayak [9][9];

for(i=0; i<=8;i++)
{
for(j=0;j<=8;j++)
{
matrize[i][j] = new Arrayak(array);
matrize_kopia[i][j] = new Arrayak(array);

}
}
.......
public void copiar_matrices(Arrayak matrize1[][],Arrayak matrize2[][])
{
for(int i=0;i<=8;i++)
{
for(int j=0;j<=8;j++)
{
//matrize1[i][j].copiar(????????);
}
}

}
}

Sasi
25 de Abril del 2006
A ver.
primero reescribe la función badago (no es que esté mal, es que te has complicado la vida)

public boolean badago(int o){
return array[o];
}

public void copiar(Arrayak arr){
for(int i=0;i<=8;i++){
array[i]=arr.badago(i);
}
jarrita=arr.jarrita;

}

public void copiar_matrices(Arrayak matrize1[][],Arrayak matrize2[][]){
for(int i=0;i<=8;i++){
for(int j=0;j<=8;j++){
matrize1[i][j].copiar(matrize2[i],[j]);
}
}

}

No lo he probado, pero creo que funcionará.
Agur

Diego
25 de Abril del 2006
Tu código bajo mi punto de vista es poco claro, lo que dificulta que los demás programadores lo entiendan. Te recomiendo que te leas algún manual sobre como escribir código, que pongas nombres más significativos (por ejemplo, cambia ezabatu(int i) y esleitu(int i) por setValor(int indice)), de modo que a ser posible, simplemente mirando el nombre del método y los parámetros se sepa que hace, sobrecarges métodos como clone() e implementes Cloneable si quieres que tu clase se pueda copiar, equals, si quieres comprobar la igualdad de un objeto con otro, toString, si quieres que al escribir Sytem.out.println(objeto) muestre el contenido del objeto, etc. Te muestro como haría el código yo:

import java.util.Arrays;

// Puede clonarse sin problemas
public class Arrayak implements Cloneable{

private boolean [] array;
private boolean jarrita;
// Tamaño por defecto
private static final int DEFAULT_SIZE=9;

// Constructor por defecto
public Arrayak(){
this(false,null);
}

public Arrayak(boolean jarrita,boolean [] array){
jarrita=false;
if(array!=null){
this.array=new boolean[array.length];
System.arraycopy(array,0,this.array,0,array.length);
}else
this.array=new boolean[DEFAULT_SIZE];
}

// Métodos set/get más claros, a los que se les pasa el valor esperado y/o el indice
public void setJarrita(boolean jarrita){
this.jarrita=jarrita;
}

public boolean getJarrita(){
return jarrita;
}

public void setValor(int indice,boolean valor){
array[indice]=valor;
}

public boolean getValor(int indice){
return array[indice];
}

public void setValores(boolean valor){
Arrays.fill(array,valor);
}

public void setValores(boolean [] array){
if(array!=null){
if(this.array.length!=array.length)
this.array=new boolean[array.length];
System.arraycopy(array,0,this.array,0,array.length);
}
}

// Método toString que devuelve una cadena que muestra el estado del objeto
public String toString(){
return "Jarrita: "+jarrita+" Valores: "+Arrays.toString(array);
}

// Método para clonar este objeto
public Arrayak clone(){
return new Arrayak(jarrita,array);
}

// Método para hacer que un Arrayak sea igual que otro.
public static void copia(Arrayak fuente,Arrayak destino){
destino.jarrita=fuente.jarrita;
destino.setValores(fuente.array);
}

// Método para hacer que un Arrayak[] sea igual que otro. Si las dimensiones son
// diferentes se introducen null.
public static void copia(Arrayak [] fuente,Arrayak [] destino){
if(fuente.length<=destino.length){
for(int i=0;i<fuente.length;i++)
destino[i]=fuente[i].clone();
Arrays.fill(destino,fuente.length,destino.length,null);
}else{
for(int i=0;i<destino.length;i++)
destino[i]=fuente[i].clone();;
}
}
// Método para hacer que un Arrayak[][] sea igual que otro. Si las dimensiones son
// diferentes se introducen null.
public static void copia(Arrayak fuente[][],Arrayak destino[][]){
if(fuente.length<=destino.length){
for(int i=0;i<fuente.length;i++)
copia(fuente[i],destino[i]);
Arrays.fill(destino,fuente.length,destino.length,null);
}else{
for(int i=0;i<destino.length;i++)
copia(fuente[i],destino[i]);
}
}
}

Espero que te sirva.