gpt4 book ai didi

java - 从 HashSet 中删除元素

转载 作者:行者123 更新时间:2023-12-02 06:28:16 24 4
gpt4 key购买 nike

我有代码:

System.out.println("before: " + clusters.size());

Iterator it = clusters.iterator();
while (it.hasNext()) {
Set<Place> set = (Set<Place>) it.next();
if (set == max2) {
System.out
.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
it.remove();
break;
}
}

System.out.println("after: " + clusters.size());

我这样做是因为 clusters.remove(max2) 返回 false。现在打印了

before: 96
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
after: 96

这怎么可能?

最佳答案

虽然您的代码应该(直观地)工作,但您遇到了集合设计方式的限制。集合的哈希值是其所有项的哈希值之和,并且哈希集的项必须具有一致的哈希值,否则在查找过程中无法找到它们。您正在使用一组集合,并且我相信您已经在子集合位于集合集合中时修改了它们,因此现在无法找到它们来删除它们。这是未定义的行为领域,因此您可能会发现针对标准库的不同版本和实现进行编译时它的行为有所不同。

你最好使用 key->set 的映射。一般来说,请记住,在将项目添加到集合中(或将其用作映射中的键)后,您不应该执行任何会更改其哈希值的操作(当然,这是针对 HashSetHashMap,这很容易是最常见的。对于其他类型,请遵循其文档中给出的特定规则,但通常可以归结为:添加后不要更改)。

编辑:似乎 KEYSER 在评论中用他的信息抢先了我。哦,好吧。

此外,关于使用 == 而不是 equals 的注释是有效的,但如果您知道该对象肯定是完全相同的引用,那么你的代码没问题(而且更快!)。从您看到的日志语句来看,情况似乎如此。

关于java - 从 HashSet 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312002/

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