我使用HashSet<String>
来存储值,但是一些String具有相同的哈希码。 HashSet如何处理冲突。
List<ClassA> getValuesFromA(){
}
List<ClassA> getValuesFromB(){
}
Set <String> a = new HashSet<String>(getValuesFromA()); // data overwritten due to hash code collision
Set <String> b = new HashSet<String>(getValuesFromB()); // data overwritten due to hash code collision
a.removeAll(b);
a.stream().forEach(t -> t.setSomeValue(X));
b.addAll(a);
我使用HashSet在每个元素的O(1)中找到负b,然后是b +(a - b)。但是在HashSet中存储数据时,一些数据会被覆盖。有没有人知道在不改变哈希方法或数据结构的情况下执行此操作?
答案 0 :(得分:0)
但是当在HashSet中存储数据时,我丢失了一些数据。如何 处理这个?
hashCode()
结果中的冲突不会松散或覆盖哈希集中具有相同哈希码的对象。
具有相同哈希码的两个对象可以存储在同一个哈希集中。
在您的示例代码中,您可以这样做:
Set <String> a = new HashSet<String>(getValuesFromA());
Set <String> b = new HashSet<String>(getValuesFromB());
a.removeAll(b);
从a
开始,您删除b
中包含的所有值
因此a
将包含a
减去b values
你做了一个排除。
然后你做:
b.addAll(a);
在b
中添加a
仅<{1}} 值的b
值时,它不是交集。
你应该使用Jon Skeet建议的retainAll()
方法,这似乎符合你的要求:
仅保留此集合中包含的元素 指定的集合
Set<String> intersectionSet = new HashSet<>(getValuesFromA());
intersectionSet.retainAll(getValuesFromB());