合并两个HashTable并删除java中的重复项

时间:2010-12-14 18:31:40

标签: java data-structures collections merge hashtable

我有两个带<int,string>对的Hashtables。现在他们每个都有重复的值,我想合并两个哈希表给我不同的值。我怎么能这样做??

感谢 编辑#1 我正在从目录中读取文件内容。并将这些内容作为标记存储在两个不同的哈希表中。现在我需要将它们合并到一个哈希表中,这会给我两个表的不同值。

3 个答案:

答案 0 :(得分:6)

您可以使用Hashtable的{​​{3}}方法合并两个哈希表。作为参数传递的哈希表将覆盖原始哈希表中的重复项。

我没有得到两个哈希表如何合并并且仍然具有不同值。如果您想从一个哈希表中删除重复的项目(并将它们留在第二个哈希表中),只需按照另一个答案中的建议操作,但不要向map2添加非重复项目。之后,您将使第一个表未经修改,第二个表中的条目不在map1中。

另一个解决方案是使用putAll合并两个哈希表并清除第二个哈希表:)

答案 1 :(得分:1)

我猜您的意思是重复键,而不是重复值。此外,由于Hashtable是一个地图实现,我将提供一个通用的地图解决方案。

// assuming the maps are of type String / String
for(Map.Entry<String, String> entry : map1.entrySet()){
    if(map2.containsKey(entry.getKey()){
        map2.remove(entry.getKey());
    }else{
        map2.put(entry.getKey(), entry.getValue());
    }
}

现在map2是已删除所有重复项的合并版本


但是如果你想要一个没有重复的Map,那么实现起来非常麻烦。也许您应该查看BidiMap中的apache commons / collections界面。它提供了地图,包括键和值都是唯一的。


实际上,这是删除重复值的简单方法:

Collection<String> values1 = map1.values();
Collection<String> values2 = map2.values();
Collection<String> values1Copy = new ArrayList<String>(values1);
Collection<String> values2Copy = new ArrayList<String>(values2);
while(values1.removeAll(values2Copy)){}
while(values2.removeAll(values1Copy)){}

现在从两个地图中删除所有重复的值。 (这假设您要完全删除dupes。如果要保留一个副本,请在while循环中使用values1和values2集合,不要复制。)

答案 2 :(得分:0)

原始提问者在评论中断言,他的意思是价值,而不是关键。这使问题不完整。为了在两个不同的表中具有重复值,密钥生成算法必须是不同的。如果是这种情况,问题中缺少的信息是他想要保留哪个密钥?第一个哈希表中的那个或第二个哈希表中的那个?

S.P.Floyd-seanizer上面提出的解决方案是正确的,但如果他确实真正意味着价值,则需要增加一点逻辑。这个额外的逻辑会告诉代码将哪个键置于合并版本中。

如果提问者有“价值”和“关键”混淆,那么他的解决方案就是现实。