【问题标题】:Copy objects into arraylist instead of pointing将对象复制到arraylist而不是指向
【发布时间】:2014-04-22 10:06:57
【问题描述】:

我正在尝试创建一个用于从一个地方(节点)到另一个地方的节点的数组列表。 nick 是地点的名称,节点的 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

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

【问题讨论】:

  • 如果nick 变量名是一个字符串,最佳实践是实际使用equals() 方法(抱歉,我必须指出这一点)。要存储副本,请使用clone() 方法(并可能在 Node 上覆盖它以供您自己使用),或者您可以拥有一个复制构造函数。

标签: java pointers arraylist dijkstra


【解决方案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]

【讨论】:

  • 虽然你的代码对我没有多大帮助,但它对你有用的事实帮助我在别处寻找问题。问题是我仍在打印 selected.nick,而不是新数组中的元素。多么愚蠢。非常感谢,不过:)
【解决方案2】:

所以我会把它放在评论中,但我的代表还不够高。不久前我在 C# 中遇到了一个类似的问题,我认为通过在循环中实例化一个新的列表组件变量来解决这个问题。不保证它会起作用,但值得一试。类似的东西

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

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

【讨论】:

  • 我实际上在发布这个问题之前尝试过这个,它对我不起作用。
【解决方案3】:

在while里面,第一行: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 方法来编写自定义代码进行克隆。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2015-04-04
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多