我对我正在制作的程序有疑问,说实话,我找不到解决办法。看来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");
}
所以它基本上做的是它抓住路径中的最后一个点作为参考,选择一个方向,然后移动到该方向上连续的点。 while循环的每次重复都应该向路径添加新的点。然而,最终发生的事情是,不仅添加了这个新点,而且已经在路径中的每个其他点都会获取最后一个点的值。通过利用上面显示的日志条目(GUI.log.append),我设法看到路径在步骤中被神秘地改变了:
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;
}
整数 y 是前面提到的方向。正如您所看到的,此方法不会以任何方式改变路径,但日志会显示它。在此示例中,节点A位于点 X = 2,Y = 3.日志显示路径中最后点的坐标是。正如您所看到的,路径中最后一个点的坐标采用新点的坐标值,但这个新的点尚未添加到路径。
老实说,我不知道这是怎么回事。如果有人能想出一个理由我会非常感激,如果你能告诉我的话。
答案 0 :(得分:8)
尝试
Point newP = new Point(n.getX(), n.getY());
而不是
Point newP = n;