2017-05-29 37 views
-1

我使用HashSet<String>存储值,但一些字符串的碰撞具有相同的散列码。 HashSet如何处理碰撞。的Java HashSet的<String>对象

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 +(a - b)查找减号b。但是,在HashSet中存储数据时,一些数据被覆盖。有没有人有任何想法来执行此操作而不更改散列方法或数据结构?

+3

“不过,虽然在HashSet的存储数据我失去了一些数据。”请更清楚一点。请注意,散列码冲突*不会丢失数据 - 它们只是使其查找值的效率稍低。请提供[mcve],因为您的问题目前尚不清楚。 –

+3

(你可能只是想用'retainAll',顺便说一句。) –

+0

检查了这一点:https://stackoverflow.com/questions/2851938/efficiently-finding-the-intersection-of-a-variable-number-of-台套的串 –

回答

0

但是,尽管HashSet的存储数据我失去了一些数据。如何 处理这个?

碰撞hashCode()结果不会丢失或覆盖HashSet中具有相同哈希码的对象。
具有相同散列码的两个对象可以存储在相同的HashSet中。

在你的示例代码,你这样做:

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); 

它不是一个路口为您添加到ba值是包含在b

你还是使用retainAll()方法,通过乔恩斯基特的建议,这似乎以满足您的要求:

仅保留此set中那些包含在 指定集合中的元素

Set<String> intersectionSet = new HashSet<>(getValuesFromA());  

intersectionSet.retainAll(getValuesFromB());