0

我知道这可能是一个幼稚的问题,但我真的需要帮助!当我使用 HashSet 并在某个函数中使用它时,在某些时候,内容 char[][] 可能会改变。我想使用 HashSet 来检查它是否包含该值,但无论值是否更改,每次它都返回 true。

例如:

HashSet<char[][]> visited = new HashSet<char[][]>();
char[][] board = Board.board // initialization;
visited.add(board);

for(int i = 0; i < 4; i++){
if(visited.contains(board)
System.out.println("Why");
}

这就是问题所在!无论板子是否更改其内容,每次它都返回“true”;

有人可以帮忙吗??

我看到评论并感谢您的回复。char[][] 板是一张地图,我想在地图上找到一条路径。“for”循环实际上是从 4 个方向查找路径的搜索算法。因此,每次董事会的内容发生变化时,我都想缩短重复项。这就是为什么我使用 hashset 来存储我已经走过的路径或地图。

4

1 回答 1

3

HashSet内部使用hashCodeandequals方法来判断两个对象是否相等。对于数组,hashCode不要equals看数组的内容。相反,它们只是根据对象的身份生成一个哈希码,并且当且仅当它们是同一个对象时,两个数组才比较相等。这意味着如果您将一个数组放入 a 中HashSet,然后在更改内容后尝试查找该数组,它总会找到它。

这里的另一个细节是,您将数组放入 中HashSet,然后在外部更改数组的内容,因为数组是一个对象,所以您还首先更改了放入的数组的副本HashSet

为了解决这个问题,我建议在数组周围定义一个包装类,然后覆盖equalshashCode根据数组的内容检查是否相等,并根据内容计算哈希码。

希望这可以帮助!

于 2013-10-16T00:05:00.817 回答