首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java克隆数组作为构造函数中的参数

Java克隆数组作为构造函数中的参数
EN

Stack Overflow用户
提问于 2014-01-08 00:01:31
回答 1查看 134关注 0票数 0

正如我在上一个问题here中所说的,我正在尝试写一个游戏AI。目前,我有一个循环,循环遍历一个单元格的邻居,生成一个可能的移动列表。在这个循环中的某个点(这是高度递归的),我声明了一个新的DotMove对象,它存储了特定移动的信息。然后将此移动附加到不断增长的移动列表中。

每个移动都有一个有序的点列表,这些点被认为是“路径”。

不幸的是,这些DotMove对象似乎没有正确地保存对路径的引用。具体来说,当我打印生成的DotMove对象的路径时,这些路径仅作为一个项目返回。(路径应该有几个项长,并且随着列表的输出而变化。)

代码语言:javascript
复制
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;

它产生以下输出:

代码语言:javascript
复制
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(...)替换为此时打印路径的语句时,将得到以下(正确)输出:

代码语言:javascript
复制
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构造函数和它调用的路径构造函数造成的。这两份文件已列入此处,供参考。

代码语言:javascript
复制
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对象用于存储该列表的“快照”,而不是对列表本身的引用。

如何正确创建此列表的浅副本?

EN

回答 1

Stack Overflow用户

发布于 2014-01-09 05:59:22

经过很长时间的劳累,臭虫就出现在这里:

代码语言:javascript
复制
ArrayList<DotMove> moveList = new ArrayList<DotMove>();

这在findMovesAtPointHelper方法的每个递归中都创建了一个新的findMovesAtPointHelper。这导致其他方法在每次迭代时丢失。

作为参考,这里有一个新的移动列表,按长度排序,然后按分数排序(最后一个数字是识别功能等效的移动的散列):

代码语言:javascript
复制
  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

...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20984515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档