【问题标题】:Contents in an ArrayList get modifiedArrayList 中的内容被修改
【发布时间】:2017-04-29 11:12:13
【问题描述】:

我正在制作的程序遇到问题,老实说我找不到解决方案。似乎Java ArrayList 集合中包含的对象正在被修改,而我没有对此类修改进行编程。

整个程序旨在通过移动路径在 10x10 网格上的两个节点之间创建随机连接。此路径表示为网格中点的 ArrayList 集合,第一个索引包含第一个节点的位置(节点 A),最后一个索引包含第二个节点的位置(节点 B)。我的做法是将自己定位在 A 的位置,然后随机移动到网格中的连续点,在 while 循环中重复此操作,直到到达 B 的位置。

除了“路径”集合以某种方式更改之外,一切似乎都有效,因此其中的每个点最终都与我移动到的最后一个点相同,这也是 B 的位置。

方法如下:

public void generateRandomPath()
{
    path = new ArrayList<Point>();
    path.add(pInitial);
    complete = false;

    while(!complete)
    {
        k = path.get(path.size()-1);
        d = selectDirection(k);

        GUI.log.append("==== Before the method. ==== \n");
        GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");

        x = move(k, d);
        path.add(x);

        if(k.getX() == pEnd.getX() && k.getY() == pEnd.getY())
            complete = true;

    }
    GUI.log.append("Finished. \n");
}
  • "Point" 是简单的点,带有 X 和Y坐标表示为 整数。
  • pInitial”是代表节点A位置的点。
  • pEnd”是代表节点B位置的点。
  • d”是我将继续进行此重复的方向。这可以是上、右、下或左,分别由整数 1、2、3 和 4 表示。
  • k”是路径中的最后一个点,也就是它在上一次重复中移动到的点。
  • x”是它在当前重复中移动到的新点。

所以它的基本作用是抓取路径中的最后一个点作为参考,选择一个方向,然后移动到该方向上的连续点。 while 循环的每次重复都应向 path 添加一个新的point。然而最终发生的事情是,不仅添加了这个新点,而且已经在 path 中的所有其他 point 都采用了添加的最后一个点的值。通过利用上面显示的日志条目 (GUI.log.append),我设法看到 path 在步骤中被神秘地改变了:

x = move(k, d);

下面的方法是什么:

private Point move(Point n, int y)
{
    GUI.log.append("==== Inside the method. ==== \n");
    GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");

    Point newP = n;
    if(y == 1)
        newP.setY(n.getY()-1);
    if(y == 2)
        newP.setX(n.getX()+1);
    if(y == 3)
        newP.setY(n.getY()+1);
    if(y == 4)
        newP.setX(n.getX()-1);

    GUI.log.append("==== After method. ==== \n");
    GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");

    return newP;
}

Integer y 就是前面提到的方向。如您所见,此方法不会以任何方式改变 path,但日志显示确实如此。在此示例中,节点 A 位于 point X = 2,Y = 3。日志显示 path 中最后一个 point 的坐标是。如你所见,path中最后一个点的坐标取了新point坐标的值,但是这个新point尚未添加到路径

老实说,我不知道这是怎么回事。如果有人能想到一个原因,如果你能告诉我,我将不胜感激。

【问题讨论】:

  • 建议 - 当你把代码 sn-ps 用于检查时,删除所有的日志记录语句。只留下您希望人们检查的基本算法。

标签: java arraylist


【解决方案1】:

试试

Point newP = new Point(n.getX(), n.getY());

而不是

 Point newP = n;

【讨论】:

  • 或Point newP = (Point)p.clone();
  • @MBFT - 假设 Point 是可克隆的。否则,这是获得高潮时刻的好方法。
  • 解决了!我不能感谢你,这可能永远不会发生在我身上。谢谢!
  • Point newP = new Point(n);
  • @MBFG - 我们是否知道此示例中的“Point”确实是“java.awt.Point”(可克隆)还是恰好被称为“Point”的类? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多