我在一個程序中遇到問題,我真的無法找到解決方案。似乎包含在Java ArrayList集合中的對象正在被修改,而我沒有編寫這樣的修改。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");
}
- 「點」 是簡單的點,用X 和Y座標由 整數表示。
- 「pInitial」是表示節點A的位置點
- 「PEND」是表示節點B.
- 「d」的位置處的點是方向上,我將會繼續這個重複。這可以是向上,向右,向下或向左分別由整數1,2,3和4表示。
- 「ķ」是在路徑,它是指向它移動了先前的重複最後一個點。
- 「x」是它在當前重複中移動的新點。
所以它基本上做的是抓住路徑中的最後一個點作爲參考,選擇一個方向,然後移動到該方向上的連續點。 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;
}
整數和是前面提到的方向。如您所見,此方法不會以任何方式更改路徑,但日誌顯示它的確如此。在這個例子中,節點A在點 X = 2,Y = 3。日誌顯示點的座標在的路徑是什麼。正如你所看到的,最後一個點的路徑座標採取新點的座標值,但這種新的點尚未加入路徑。
老實說,我不知道這是怎麼發生的。如果有人能想到一個理由,我會非常感激,如果你能告訴我。
建議 - 當你把代碼段進行檢查,刪除所有日誌記錄語句了。只留下基本上你想讓人們檢查的基本算法。 – 2011-04-18 20:52:48