2011-04-19 5 views
1

J'aurais besoin d'aide avec le code suivant si vous êtes gentil. Fondamentalement, j'ai un nœud d'arbre qui se souvient de son nœud parent, le niveau de profondeur et son état actuel (un tableau 2D). La plupart des noms de variables sont écrits dans ma langue maternelle, j'espère que ce n'est pas un problème:Problème de clonage d'obj Java

public class Nod implements Cloneable { 

private Nod parinte;//parent node 
private int[][] stare;//state 
private int cost;//depth-level 
private String actiune;//the action used to obtain this node 
private volatile int hashCode = 0; 

public boolean equals(Object obj) 
{ 
    if(this == obj) 
    { 
     return true; 
    } 
    if (!(obj instanceof Nod)) 
    { 
     return false; 
    } 
    Nod nod = (Nod)obj; 
    return cost == nod.getCost() && actiune.equals(nod.getActiune()) 
      && stare.equals(nod.getStareNod()); 
} 

public int hashCode() 
{ 
    StringBuffer strBuff = new StringBuffer(); 
    try 
    { 
     int n = Problema.Dimensiune();//returns the dimension of state matrix 
     for (int i=0;i<n;i++) 
      for (int j=0;j<n;j++) 
       strBuff.append(stare[i][j]); 
     strBuff.append(cost); 
     strBuff.append(actiune); 

     String str = strBuff.toString(); 
     hashCode = str.hashCode(); 

    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return hashCode; 
} 

    public Object clone() throws CloneNotSupportedException 
    { 
     return super.clone(); 
    } 


public static boolean goUp(int[][] st) throws IOException 
{ 

    int n = Problema.Dimensiune(); 
    boolean ok = false; 
    int[][] a = st; 

    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
     { 
      if (a[i][j] == 0) 
       if (i != 0) 
        ok = true; 
     } 
    return ok; 
} 

public static boolean goDown(int[][] st) throws IOException 
{ 

    int n = Problema.Dimensiune(); 
    boolean ok = false; 
    int[][] a = st; 

    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
     { 
      if (a[i][j] == 0) 
       if (i != (n-1)) 
        ok = true; 
     } 
    return ok; 
} 

public static boolean goLeft(int[][] st) throws IOException 
{ 

    int n = Problema.Dimensiune(); 
    boolean ok = false; 
    int[][] a = st; 

    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
     { 
      if (a[i][j] == 0) 
       if (j != 0) 
        ok = true; 
     } 
    return ok; 
} 

public static boolean goRight(int[][] st) throws IOException 
{ 

    int n = Problema.Dimensiune(); 
    boolean ok = false; 
    int[][] a = st; 

    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
     { 
      if (a[i][j] == 0) 
       if (j != (n-1)) 
        ok = true; 
     } 
    return ok; 
} 


public static int[] Zero(int[][] st) throws IOException 
{ 

    int[][] a = st; 
    int n = Problema.Dimensiune(); 
    int[] b = new int[2]; 

    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
      if (a[i][j] == 0) 
      { 
       b[0] = i; 
       b[1] = j; 
      } 

    return b; 
} 

public static int[][] Actiune(int[][] st, String s) throws IOException 
{ 

    int[][] a = st; 
    int[] b = Zero(st); 

    if ((goRight(st) == true) && (s == "right")) 
    { 

     a[b[0]][b[1]] = a[b[0]][b[1]+1]; 
     a[b[0]][b[1]+1] = 0; 
    } 

    if ((goLeft(st) == true) && (s == "left")) 
    { 

     a[b[0]][b[1]] = a[b[0]][b[1]-1]; 
     a[b[0]][b[1]-1] = 0; 
    } 

    if ((goUp(st) == true) && (s == "up")) 
    { 

     a[b[0]][b[1]] = a[b[0]-1][b[1]]; 
     a[b[0]-1][b[1]] = 0; 
    } 

    if ((goDown(st) == true) && (s == "down")) 
    { 

     a[b[0]][b[1]] = a[b[0]+1][b[1]]; 
     a[b[0]+1][b[1]] = 0; 
    } 

    return a; 
} 

public Nod(){} 

public Nod (int[][] st) 
{ 
    parinte = null; 
    stare = st; 
    cost = 0; 
    actiune = null; 
} 

public Nod (Nod nod) 
{ 
    parinte = nod.parinte; 
    stare = nod.stare; 
    cost = nod.cost; 
    actiune = nod.actiune; 
} 

public Nod(Nod nodp, String ac) throws IOException 
{ 
    this.parinte = nodp; 
    this.cost = parinte.getCost()+1; 
    this.actiune = ac; 
    this.stare = Actiune(parinte.getStareNod(),actiune); 
} 

public void setCost(int cost) 
{ 
    this.cost = cost; 
} 

public int getCost(){ 
    return this.cost; 
} 

public void setStareNod(int[][] stare) 
{ 
    this.stare = stare; 
} 

public int[][] getStareNod(){ 
    return this.stare; 
} 

public void setNodParinte(Nod parinte) 
{ 
    this.parinte = parinte; 
} 

public Nod getNodParinte() throws IOException{ 
    return this.parinte; 
} 

public void setActiune(String actiune) 
{ 
    this.actiune = actiune; 
} 

public String getActiune() 
{ 
    return this.actiune; 
} 

}

Maintenant, je crée un nœud initial et après, un enfant nœud de celui-ci. Le problème est que lorsque je crée le nœud enfant, le tableau 2D du parent devient identique au tableau de l'enfant. J'ai essayé de cloner l'objet de noeud mais il ne l'a pas réparé. J'apprécierais si quelqu'un a une idée comment le réparer et le partage.

public class test { 

public static void main(String[] args) throws IOException, CloneNotSupportedException 
{ 
    int[][] p = Problema.stareInitiala(); 
    Nod nod = new Nod(p); 

    Nod nodc = (Nod) nod.clone(); 
    Nod nod1 = new Nod(nodc,"right"); 

    Nod nod1c = (Nod) nod1.clone(); 
    Nod nod2 = new Nod(nod1c,"up"); 

    if (nod.getStareNod().equals(nod.getStareNod())) 
     System.out.print("ok"); 
    else 
     System.out.print("not ok"); 
} 

}

Donc, si p = {{7,2,4}, {5,0,6}, {8,3,1}} l'instruction if doit revenir "pas correct" , mais à la place je reçois le message "ok".

Répondre

3

Il n'y a rien de cassé ou de faux dans le mécanisme de clonage. Juste un groupe ou des programmeurs qui ne le comprennent pas, voici un cours valide pour votre classe. Cette implémentation suppose que le clone souhaite utiliser le même parent que l'original. Si ce n'est pas le cas, vous devrez également le cloner, ou peut-être définir le parent sur null.

+0

Vous aviez raison, je ne comprends pas complètement les mécanismes de la POO mais j'essaie de régler cette étape par étape. – MRM

+0

Maintenant, cela fonctionne, merci, et je peux dire que je comprends ce que j'ai fait de mal dans mon remplacement de clonage. – MRM

0

Vous pouvez regarder le documentation de la méthode clone() de l'objet. L'implémentation de clone par défaut (c'est-à-dire si vous avez implémenté Cloneable, ce que vous avez fait) effectue une copie superficielle. Ce n'est probablement pas ce que vous voulez, vous pouvez être mieux en écrivant votre propre méthode de copie.

+0

Je le ferai, beaucoup – MRM