2014-04-22 12 views
-1

我正在尝试创建用于从一个位置(节点)到另一个位置(节点)的节点的数组列表。 nick是该地点的名称,而Node的pi是路径中的前一个节点。将对象复制到arraylist而不是指向

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

的问题是,在所有元素百威变得相同。当我打印bestWay我刚刚得到PLACE1,PLACE1,PLACE1,PLACE1,而不是PLACE1,PLACE2,PLACE3,PLACE4

是否有可能将元素复制到数组中,而不是将指针添加到之后在行上更改的所选元素。 非常感谢!

+0

如果'nick'变量名是一个字符串,实际使用'等于它的最佳实践()'方法(对不起,我不得不指出这一点)。要存储副本,可以使用'clone()'方法(并且可能在Node上覆盖它以供您自己使用),或者您可以使用复制构造函数。 – Alejandro

回答

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; 
    } 
} 

OUTPUT:

[Place1, Place2, Place3, Place4] 
+0

虽然你的代码对我没有多大帮助,但它对你有用的事实帮助我在别处寻找问题。问题在于我仍然在打印selected.nick,而不是新数组中的元素。多愚蠢。非常感谢,虽然:) – Phil

0

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

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

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

我实际上在我发布这个问题之前试过这个,并且它对我没有用。 – Phil

0

里面的东西时,第一行:bestWay.add(chosen);将记录添加到百威。

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

如果你的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类中重写克隆方法来克隆代码。

希望这有助于

相关问题