簡體   English   中英

Java克隆數組作為構造函數中的參數

[英]Java cloning arrays as parameters in a constructor

正如我剛才的問題說在這里 ,我試圖寫一個游戲AI。 當前,我有一個循環遍歷單元的鄰居,生成可能的動作列表。 在此循環的某個點(高度遞歸),我聲明了一個新的DotMove對象,該對象存儲該特定移動的信息。 然后,此舉將添加到不斷增長的舉動列表中。

每個動作都有一個點的有序列表,這些點被認為是“路徑”。

不幸的是,這些DotMove對象似乎沒有正確保存對路徑的引用。 具體來說,當我打印所生成的DotMove對象的路徑時,這些路徑僅返回一項。 (路徑為幾項,並且隨着列表的打印而變化。)

List<Edge> e = getEdgesAt(p, con);
ArrayList<DotMove> moveList = new ArrayList<DotMove>();

for (Edge edge : e) {
    if (visited.add(edge)) {
        Point next = edge.getNextPoint(p);
        path.add(next);
        findMovesAtPointHelper(next, path, connected, visited);
        moveList.add(new DotMove(path, this));
    }
}
path.remove(path.size() - 1);
return moveList;

產生以下輸出:

r r b g r g r g 
r r b g y r r b 
b r b g b r r p 
b r b b g r r r 
b r b r r r b r 
r b b p r p b b 
p r y y g g b b 
p y r b y p b r 

[(0, 0)]
[(0, 1)]
[(1, 0)]
[(1, 1)]
[(1, 2)]
[(1, 2)]
[(1, 2)]

但是,當我用當時打印路徑的語句替換moveList.add(...)時,得到以下(正確)輸出:

r r b g r g r g 
r r b g y r r b 
b r b g b r r p 
b r b b g r r r 
b r b r r r b r 
r b b p r p b b 
p r y y g g b b 
p y r b y p b r 

[(0, 0), (0, 1), (1, 1), (1, 0)]
[(0, 0), (0, 1), (1, 1)]
[(0, 0), (0, 1), (1, 1), (1, 2), (1, 3)]
[(0, 0), (0, 1), (1, 1), (1, 2)]
[(0, 0), (0, 1), (1, 1)]
[(0, 0), (0, 1)]
[(0, 0)]

我相信這種差異是由我的DotMove構造函數及其調用的Path構造函數引起的。 這兩個已包含在此處以供參考。

public DotMove(ArrayList<Point> path, BoardModel boardModel) {
    this.path = new Path(path);
    this.cleared = path;
    this.score = path.size();
}

public Path(List<Point> path){
    this.path = new ArrayList<Point>(path);
}

似乎Path()構造函數將保留對整個列表的引用,而不是對列表進行淺表復制。 這可以解釋為什么DotMove對象內的列表較短的原因,因為移動查找算法依賴於遍歷電路板時從列表末尾刪除項目。 DotMove對象用於存儲此列表的“快照”,而不是對列表本身的引用。

如何正確創建此列表的淺表副本?

辛勤工作后,該錯誤位於此處:

ArrayList<DotMove> moveList = new ArrayList<DotMove>();

這創造了一個新的moveList在每一個遞歸findMovesAtPointHelper方法。 這導致其他方法在每次迭代時都會丟失。

作為參考,這是一個新的動作列表,按長度排序,然后按得分排序(最后一個數字是標識功能上等效的動作的哈希值):

  0 1 2 3 4 5 
0 r r b g b r 
1 r r b r r r 
2 b r b y y b 
3 b g b y b b 
4 b y b p b b 
5 y b r b y b 

Top 5 moves: 
 17 Loop [(4, 3), (4, 4), (5, 4), (5, 3), (4, 3)] -86374027
 17 Loop [(4, 4), (4, 3), (5, 3), (5, 4), (4, 4)] -86374027
 17 Loop [(5, 3), (4, 3), (4, 4), (5, 4), (5, 3)] -86374027
 17 Loop [(5, 4), (4, 4), (4, 3), (5, 3), (5, 4)] -86374027
 17 Loop [(5, 2), (5, 3), (4, 3), (4, 4), (5, 4), (5, 3)] -86374027

Bottom 5 moves: 
  2      [(5, 5), (5, 4)] -739973680
  2      [(5, 4), (4, 4)] -1399527984
  2      [(5, 3), (4, 3)] 831841744
  2      [(4, 4), (4, 3)] 1423500752
  2      [(5, 2), (5, 3)] 2075715024

Pre-uniquify: 105
Post-uniquify: 105
All 105 moves: 
 17 Loop [(4, 3), (4, 4), (5, 4), (5, 3), (4, 3)] -86374027
 17 Loop [(4, 4), (4, 3), (5, 3), (5, 4), (4, 4)] -86374027
 17 Loop [(5, 3), (4, 3), (4, 4), (5, 4), (5, 3)] -86374027
 17 Loop [(5, 4), (4, 4), (4, 3), (5, 3), (5, 4)] -86374027
 17 Loop [(5, 2), (5, 3), (4, 3), (4, 4), (5, 4), (5, 3)] -86374027
 17 Loop [(5, 3), (4, 3), (4, 4), (5, 4), (5, 3), (5, 2)] -86374027
 17 Loop [(5, 4), (4, 4), (4, 3), (5, 3), (5, 4), (5, 5)] -86374027
 17 Loop [(5, 5), (5, 4), (4, 4), (4, 3), (5, 3), (5, 4)] -86374027
 10 Loop [(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)] -834522920
 10 Loop [(0, 1), (0, 0), (1, 0), (1, 1), (0, 1)] -834522920
 10 Loop [(1, 0), (0, 0), (0, 1), (1, 1), (1, 0)] -834522920
 10 Loop [(1, 1), (0, 1), (0, 0), (1, 0), (1, 1)] -834522920
 10 Loop [(1, 1), (0, 1), (0, 0), (1, 0), (1, 1), (1, 2)] -834522920
 10 Loop [(1, 2), (1, 1), (0, 1), (0, 0), (1, 0), (1, 1)] -834522920
  6      [(5, 2), (5, 3), (4, 3), (4, 4), (5, 4), (5, 5)] 1195567956
  6      [(5, 5), (5, 4), (4, 4), (4, 3), (5, 3), (5, 2)] 1195567956
  5      [(0, 1), (0, 0), (1, 0), (1, 1), (1, 2)] -1697404439

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM