【问题标题】:Java - how to remove duplicating entries from HashMap?Java - 如何从 HashMap 中删除重复的条目?
【发布时间】:2014-10-08 03:44:45
【问题描述】:

我在 Java 中有一个 HashMap

HashMap<String, Integer> meh = new HashMap<String, Integer>();`

meh.put("one", 1);
meh.put("one", 1);
meh.put("one", 1);
meh.put("two", 1);
meh.put("two", 2);
meh.put("three", 3);

我需要的是删除重复的条目(“一”,1)[当键和值都重复时]。我搜索并发现只有“如何删除重复的键/值”。有人可以帮忙吗?

【问题讨论】:

  • 已经完成了...您不能有多个具有相同键的条目...
  • 您确定可以有重复的密钥吗?首先检查 java 文档...
  • 地图不会让您多次使用同一个键进入。就像在现实世界中一样,地图上的点只能描述一个位置,因此每次您使用 put(key, value) 和相同的键时,您只会更新现有值。我能想到的 map 存储多个具有相同键的条目的唯一方法是,当键的实例是一种错误地覆盖哈希码和等于方法的类型时,这对于字符串类型的键是不可能的。
  • @Ascalonian:这不是重复的,那个问题没有重复的键。

标签: java hashmap duplicates


【解决方案1】:

没有必要这样做,HashMap 会自动处理。执行该代码时会发生什么,基本上如下:

meh.put("one", 1);

这使得地图 {"one" -> 1}

meh.put("one", 1);

这会自行替换分配,使地图 {"one" -> 1}

meh.put("one", 1);

这会自行替换分配,使地图 {"one" -> 1}

meh.put("two", 1);

这会添加请求的链接,使地图 {"one" -> 1, "two" -> 1}

meh.put("two", 2);

这取代了“二”的分配,使地图{“一”-> 1,“二”-> 2}

meh.put("three", 3);

这会添加新元素,使总映射 {"one" -> 1, "two" -> 2, "three" -> 3} 不涉及重复。

【讨论】:

    【解决方案2】:

    您无法从HashMap 中删除重复项,因为首先HashMap 中没有重复项。第二次(或第三次,或其他)您使用地图中已存在的键调用 put 时,它只会用新的键覆盖该值,无论它是否与先前存在的键重复.

    在您提供的代码 sn-p 中,地图将只有三个值。

    【讨论】:

      【解决方案3】:

      根据您的描述,Map&lt;String, Integer&gt; 不是适合您需求的结构:您似乎没有将值 2 关联到 "two",但您实际上是在存储元素对。

      更好的数据结构可能是使用MyPairSet,其中MyPair 是:

      public class MyPair {
          private String first;
          private int second;
          // + constructor, getters + setters, hashcode + equals
      }
      

      然后您可以在HashSet 中使用该MyPair 对象:

      Set<MyPair> myPairs = new HashSet();
      myPairs.add(new MyPair("one", 1));
      myPairs.add(new MyPair("one", 2));
      myPairs.add(new MyPair("two", 2));    
      myPairs.add(new MyPair("two", 2));
      myPairs.remove(new MyPair("one", 2)); // remove MyPair("one", 2) only
      

      【讨论】:

      • 比我快四秒,而且我喜欢你的明确观察,即 OP 实际上只是存储元素对。我要离开我的,因为 OP 对哈希图的使用表明可能需要提取键映射到的所有唯一值。
      【解决方案4】:

      您真正的问题不是如何删除重复项。

      这是如何使用重复键保留唯一值。

      有关详细信息,请参阅 Jon Skeet 的此答案 https://stackoverflow.com/a/8229534/152578,但基本上您正在寻找多地图。

      您必须检查插入时的值。

      另一种选择是将键和值联合起来(方法取决于您的符号空间),并将它们存储在一个集合中。

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 2016-07-29
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多