【问题标题】:Merging Two HashTable with removal of duplicates in java在java中合并两个HashTable并删除重复项
【发布时间】:2011-05-25 11:25:03
【问题描述】:

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

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

【问题讨论】:

  • 什么是“配对哈希表”?另外,您确定要删除重复值,还是删除重复键?
  • 对不起,我认为它已被编辑...我的意思是整数,字符串对。我想摆脱重复的值。
  • 否 - 您没有正确标记尖括号。至于删除重复值:您要删除哪些键?
  • 我对每个值都有唯一的 int 键,所以没有要删除的特定键,我只想合并这两个表以获得一个具有两个不同值的表。
  • 哈希表将键映射到唯一值。两个输入哈希表中不能有任何重复的条目。可能存在与相同值关联的键,并且可能在两个哈希表中都找到键。您希望在每种情况下发生什么?必要时画图。一图胜千言。

标签: java data-structures collections merge hashtable


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我猜你的意思是重复的键,而不是重复的值。另外,由于 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 是合并后的版本,删除了所有重复项


    但是如果你想要一个没有重复值的地图,那实现起来相当麻烦。也许您应该查看apache commons / collections 中的BidiMap 接口。它提供的映射是键和值都是唯一的。


    其实,这里有一个简单的去除重复值的方法:

    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)){}
    

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

    【讨论】:

    • 嗯,这就是我所困惑的。但是为了你的信息。我正在再次编辑我的问题。
    【解决方案3】:

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

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

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

    【讨论】:

    • 好吧,是不是可以创建一个新的哈希表,它没有来自两个表的重复值?!
    • 是的,当然,但你必须选择你想要它在哪个键下。上面有人问你是否说重复键,你说不,重复值。这意味着可能存在没有重复键的重复值。在这种情况下,您必须在结果表中选择要删除重复值的键。
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2018-06-09
    • 2015-06-09
    • 2017-06-05
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多