gpt4 book ai didi

java - HashSet包含对象时无论内容是否改变都返回true

转载 作者:行者123 更新时间:2023-12-01 23:30:29 25 4
gpt4 key购买 nike

我知道这可能是一个幼稚的问题,但我真的需要帮助!当我使用 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[][] 板是一张 map ,我想找到一条路径在 map 上。 “for”循环实际上是从4个方向寻找路径的搜索算法。因此,每次黑板的内容发生变化时,我都想缩短重复内容。这就是为什么我使用哈希集来存储我已经走过的路径或 map 。

最佳答案

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

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

要解决此问题,我建议围绕数组定义一个包装类,然后重写 equals 和 hashCode 以根据数组的内容检查是否相等,以及从内容计算哈希码。

希望这有帮助!

关于java - HashSet包含对象时无论内容是否改变都返回true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19393137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com