0

マップ全体で星の検索を実行するプログラムを書いています。マップのすべてのノードを保持するクラスを作成しました。

public Node {
   Node up_node, right_node, down_node, left_node;
}

public class Star {
    public static void main(String args[]) {
        Node a=new Node();
        Node b=new Node();
        Node h=new Node();
        Node here=new Node();

        Node[] NextNode;
        NextNode = new Node[10];
        for(int i=0;i<10;i++) {
            NextNode[i]=new Node();
        }
        int j=0;
        a.up_node=h;
        a.right_node=b;

        b.left_node=a;

        h.down_node=a;

        //if certain conditions are met
        NextNode[j].here_node=a.up_node;
        //what i was hoping to do is copy the node a.up which is h
    }
}

この場合、NextNode[0] に。ただし、何らかのメモリアドレスを返し続けます: test.Node@10b28f30: test はパッケージの名前です。助けてください!

4

3 に答える 3

1

クラスの内部プロパティを表示するには、toString() メソッドを @override します。

デフォルトでは、java は完全なクラス名@hashCode 値を表示します。

于 2013-04-08T19:30:09.287 に答える
1

Java の変数は、実際のオブジェクトではなくオブジェクト参照です。同じオブジェクトを作成してポイントします。これはあなたが望むものではありませんか?NextNode[j].here_node = a.up_node;NextNode[j].here_nodea.up_node

オブジェクトの完全に新しいコピーを作成したい場合は、それをNodeクラスに実装できます。

public class Node {
  Node up_node, right_node, down_node, left_node;

  public Node clone() {
    Node ret = new Node();

    // copy the properties
    ret.up_node = this.up_node;
    ...

    return ret;
  }
}

NextNode[j].here_node = a.up_node.clone();

コピーを作成します (これは浅いものにすぎませんが、コピーは、フィールドのコピーではなく、フィールドを介して同じオブジェクトを指します)。

「アドレス」を返すコードについての混乱は、ノードを印刷しようとしたために発生したと思います。

System.out.println(a.up_node);

のようなものが得られますがtest.Node@10b28f30、試してみてください

System.out.println(NextNode[j].here_node);

そして、それらが同じオブジェクトを指していることを示す、まったく同じ文字列を取得する必要があります。

Nodeより良いものを得るには、の の実装をオーバーライドする必要がありますtoString()Nodeそれぞれに一意の番号を与える例を次に示します。

public class Node {
  Node up_node, right_node, down_node, left_node; 

  // how many nodes were created
  private static int count = 0;

  // the number of this node
  private int number;

  public Node() {
    // increment the number of nodes created
    ++Node.count;
    // assign that number to this node
    this.number = Node.count;
  }

  public String toString() {
    return "Node #" + this.number;
  }
}
于 2013-04-08T19:37:57.717 に答える