ArrayList中的内容被修改

Han*_*ans 0 java arraylist

我对我正在制作的程序有疑问,说实话,我找不到解决办法.看来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");
}
Run Code Online (Sandbox Code Playgroud)
  • " "只是点,X和Y坐标用整数表示.
  • " pInitial "是表示节点A的位置的点.
  • " pEnd "是表示节点B的位置的点.
  • " d "是我将继续这个重复的方向.这可以分别由向上,向右,向下或向左表示,分别由整数1,2,3和4表示.
  • " k "是路径中的最后一个点,也就是它在前一次重复时移动的点.
  • " x "是它在当前重复上移动的新点.

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

x = move(k, d);
Run Code Online (Sandbox Code Playgroud)

以下是哪种方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

整数y是前面提到的方向.正如您所看到的,此方法不会以任何方式改变路径,但日志显示它确实如此.在这个例子中,节点A是在 X = 2,Y = 3日志显示了最后的坐标路径是.如您所见,路径中最后一个点的坐标采用新坐标的,但此新尚未添加到路径中.

路径改变的例子.

老实说,我不知道这是怎么回事.如果有人能想出一个理由我会非常感激,如果你能告诉我的话.

Bal*_*a R 8

尝试

Point newP = new Point(n.getX(), n.getY());
Run Code Online (Sandbox Code Playgroud)

代替

 Point newP = n;
Run Code Online (Sandbox Code Playgroud)

  • 或者'Point newP = new Point(n);` (2认同)
  • @MBFG - 我们是否知道此考试中的'Point'是否确实是'java.awt.Point'(可克隆)或者只是一个恰好被称为'Point'的类?;) (2认同)