在java中通过删除重复项合并两个哈希表

在java中通过删除重复项合并两个哈希表,java,data-structures,collections,merge,hashtable,Java,Data Structures,Collections,Merge,Hashtable,我有两个hashtable和对。现在,它们中的每一个都有重复的值,我想合并这两个哈希表以获得不同的值。我该怎么做 谢谢 编辑#1我正在从目录中读取文件内容。并将这些内容作为令牌存储在两个不同的哈希表中。现在我需要将它们合并到一个哈希表中,该哈希表将为这两个表提供不同的值 您可以使用Hashtable的方法合并两个Hashtable。作为参数传递的哈希表将覆盖原始哈希表中的重复项 我不明白两个哈希表如何可以合并,并且仍然具有不同的值。如果要从一个哈希表中删除重复项(并将其保留在第二个哈希表中),只

我有两个hashtable和
对。现在,它们中的每一个都有重复的值,我想合并这两个哈希表以获得不同的值。我该怎么做

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

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

我不明白两个哈希表如何可以合并,并且仍然具有不同的值。如果要从一个哈希表中删除重复项(并将其保留在第二个哈希表中),只需按照另一个答案中的建议执行,但不要将非重复项添加到
map2
。之后,第一个表将不被修改,第二个表将包含不在
map1
中的条目


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

我猜您的意思是重复的键,而不是重复的值。另外,由于哈希表是一个映射实现,我将提供一个通用的映射解决方案

// 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());
    }
}
//假设映射的类型为String/String
对于(Map.Entry:map1.entrySet()){
if(map2.containsKey(entry.getKey()){
map2.remove(entry.getKey());
}否则{
put(entry.getKey(),entry.getValue());
}
}
现在,map2是已删除所有重复项的合并版本


但是如果你想要一个没有重复值的映射,那么实现起来相当麻烦。也许你应该查看中的接口。它提供了映射都是键,并且值是唯一的


实际上,有一种简单的方法可以删除重复值:

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)){}
Collection values1=map1.values();
集合值2=map2.values();
集合值1副本=新阵列列表(值1);
集合值2copy=新阵列列表(值2);
while(values1.removeAll(values2Copy)){}
while(values2.removeAll(values1Copy)){}

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

最初的提问者在评论中声称他指的是值,而不是键。这使得问题不完整。为了在两个不同的表中有重复的值,键生成算法必须不同。如果是这样的话,问题中缺少的信息是他要保留哪个键是第一个哈希表中的一个还是第二个哈希表中的一个

上面由S.p.Floyd-seanizer提出的解决方案是正确的,但是如果他真的,真的是平均值,则需要添加一点逻辑。这个额外的逻辑将告诉代码在合并版本中将该内容放在哪个键下


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

什么是“带对的哈希表”?另外,您确定要删除重复值,或者更确切地说是重复键吗?抱歉,我认为它已被编辑…我是指整数、字符串对。我要删除重复值。否-您没有正确标记尖括号。至于删除重复值:您要删除哪些键?我有唯一的int键每个值,因此没有要删除的特定键,我只想合并这两个表,以获得一个具有两个不同值的表。哈希表将键映射到唯一值。两个输入哈希表中不能有任何重复项。可能有与相同值关联的键,也可能有在中找到的键两个哈希表。你想在每种情况下发生什么?如果必要的话绘制图表。一张图片胜过千言万语。好吧,这正是我所困惑的。但是为了你的信息。我正在再次编辑我的问题。好吧,难道不可能创建一个新的哈希表,它没有来自两个表的重复值吗?!是的,当然,但你必须选择e您希望它位于哪个键下。上面有人问您是否是指重复键,您说否,即重复值。这意味着可能存在不带重复键的重复值。在这种情况下,您必须在结果表中选择要消除重复值的键。