Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将修改ArrayList中的内容_Java_Arraylist - Fatal编程技术网

Java 将修改ArrayList中的内容

Java 将修改ArrayList中的内容,java,arraylist,Java,Arraylist,我在制作一个程序时遇到了一个问题,我实在找不到解决办法。似乎Java ArrayList集合中包含的对象正在被修改,而我没有编写这样的修改 该程序作为一个整体,基本上是通过移动路径在10x10网格上的两个节点之间创建随机连接。该路径表示为网格中点的ArrayList集合,第一个索引包含第一个节点的位置节点A,最后一个索引包含第二个节点的位置节点B。我如何做到这一点,是将自己定位在A的位置,然后随机移动到网格中的相邻点,在while循环中重复此操作,直到到达B的位置 除了路径集合以某种方式被改变之

我在制作一个程序时遇到了一个问题,我实在找不到解决办法。似乎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");
}
以下哪种方法:

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;
}
整数y是前面提到的方向。正如您所看到的,这个方法不会以任何方式改变路径,但是日志显示它确实改变了路径。在本例中,节点A位于点X=2,Y=3上。日志显示路径中最后一点的坐标。如您所见,路径中最后一个点的坐标值与新点的坐标值相同,但此新点尚未添加到路径中

我真的不知道这是怎么发生的。如果有人能想出一个原因,如果你能告诉我,我将不胜感激。

试试看

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

 Point newP = n;

或Point newP=Pointp.clone@MBFT-假设点是可克隆的。否则,这是获得卡普特时刻的好方法。这就解决了问题!我真是太感谢你了,我可能永远也不会想到这一点。谢谢或点newP=新点n@MBFG——我们知道这个例子中的“Point”是一个可克隆的“java.awt.Point”还是一个碰巧被称为“Point”的类吗;建议-当您放置代码片段以供检查时,请删除所有日志记录语句。只留下基本上你希望人们检查的基本算法。
 Point newP = n;