【发布时间】: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 用于检查时,删除所有的日志记录语句。只留下您希望人们检查的基本算法。