2011-04-18 33 views
0

我在一個程序中遇到問題,我真的無法找到解決方案。似乎包含在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。日誌顯示點的座標的路徑是什麼。正如你所看到的,最後一個點的路徑座標採取新的座標值,但這種新的尚未加入路徑

Example of the alteration of path.

老實說,我不知道這是怎麼發生的。如果有人能想到一個理由,我會非常感激,如果你能告訴我。

+0

建議 - 當你把代碼段進行檢查,刪除所有日誌記錄語句了。只留下基本上你想讓人們檢查的基本算法。 – 2011-04-18 20:52:48

回答

8

嘗試的

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

代替

Point newP = n; 
+0

或Point newP =(Point)p.clone(); – MeBigFatGuy 2011-04-18 20:48:57

+0

@MBFT - 假設點是可克隆的。否則,這是獲得快樂時光的好方法。 – 2011-04-18 20:50:53

+0

解決了!我無法感謝你,我可能永遠不會想到。謝謝! – Hans 2011-04-18 20:51:36