将对象复制到arraylist而不是指向

时间:2014-04-22 10:06:57

标签: java pointers arraylist dijkstra

我正在尝试创建一个用于从一个地方(节点)到另一个地方(节点)的节点的arraylist。 nick是地点的名称,Node的pi是路径中的前一个节点。

ArrayList<Node> bestWay = new ArrayList<Node>();
while(chosen.nick != from){
    bestWay.add(chosen);
    chosen = chosen.pi;
}

问题是 bestWay 中的所有元素都变得相同。当我打印 bestWay 时,我得到 PLACE1,PLACE1,PLACE1,PLACE1 ,而不是 PLACE1,PLACE2,PLACE3,PLACE4

是否可以将元素复制到数组中,而不是添加指向后面的行更改的selected元素的指针。 非常感谢!

3 个答案:

答案 0 :(得分:1)

这是一个试图模仿你解释的例子。它对我有用,错误应该在其他地方我猜:

public class Example {

    public static void main(String[] args) {
        List<Node> bestWay = new ArrayList<Node>();
        Node chosen = new Node("Place1");
        String from = chosen
                .add("Place2")
                .add("Place3")
                .add("Place4")
                .add("Place5")
                .nick;
        while (chosen.nick != from) {
            bestWay.add(chosen);
            chosen = chosen.pi;
        }
        System.out.println(bestWay);
    }
}

class Node {

    final String nick;
    Node pi;

    Node(String nick) { this.nick = nick; }

    public Node add(String nick) {
        pi = new Node(nick);
        return pi;
    }

    @Override public String toString() {
        return nick;
    }
}

输出:

[Place1, Place2, Place3, Place4]

答案 1 :(得分:0)

所以我把它放在评论中,但我的代表不够高。我在C#中遇到了一个类似的问题,我认为问题是通过在循环中实例化一个新的列表组件变量来解决的。没有希望它会起作用,但值得一试。像

这样的东西
ArrayList<Node> bestWay = new ArrayList<Node>();
  while(chosen.nick != from){
  Node dummy = new Node();
  dummy = chosen;

  bestWay.add(dummy);
  chosen = chosen.pi;      
}

答案 2 :(得分:0)

在内部,第一行:bestWay.add(chosen);将记录添加到bestWay。

在此之后,您完成了:chosen = chosen.pi;这会将所选对象的引用更改为selected.pi的引用,因此这也会更改您添加到arraylist bestway的值。这就是你在arraylist中获得相同价值的原因。

如果您的Node类可以克隆,那么您可以执行以下操作:

ArrayList<Node> bestWay = new ArrayList<Node>();
while(chosen.nick != from){
    bestWay.add(chosen);
    chosen = chosen.pi.clone();
}

或者这个:

ArrayList<Node> bestWay = new ArrayList<Node>();
while(chosen.nick != from){
    bestWay.add(chosen.clone());
    chosen = chosen.pi;
}

如果Node类还不可克隆,那么您可以通过在Node类中重写clone方法来编写自定义代码以进行克隆。

希望这会有所帮助

相关问题