【问题标题】:Delete all the entries but the specified Key set from Hash Map从 Hash Map 中删除除指定 Key 集之外的所有条目
【发布时间】:2023-03-28 23:27:01
【问题描述】:

我正在尝试删除 HashMap 中除了指定的键集之外的所有条目。 例如,HashMap numToalphaMap 具有条目 1-->a、2-->b、3-->c、4-->d。给定 KeySet 是 {1, 2}。我想从 numToalphaMap 中删除其他条目,即 (3-->c, 4-->d)。谁能帮我解决这个问题?

【问题讨论】:

    标签: java hashmap set


    【解决方案1】:

    最简单的方法(在 Java 8 中)是删除任何不在 keySet 中的键:

    map.keySet().removeIf(k -> !keySet.contains(k));
    

    【讨论】:

      【解决方案2】:

      如果你使用的是 Java 8,下面的流解决方案怎么样?

          Set<Integer> keysToKeep = new HashSet<>();
          keysToKeep.add(1);
          keysToKeep.add(2);
      
          Map<Integer, String> intToStringMap = new HashMap<>();
          intToStringMap.put(1, "a");
          intToStringMap.put(2, "b");
          intToStringMap.put(3, "c");
          intToStringMap.put(4, "d");
      
      
          Map<Integer, String> filteredMap = 
                  intToStringMap.entrySet().stream()
                  .filter(x -> keysToKeep.contains(x.getKey()))
                  .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
      

      Java 7 版本:

          Iterator<Map.Entry<Integer, String>> entryIterator = intToStringMap.entrySet().iterator();
      
          while (entryIterator.hasNext()) {
              Map.Entry<Integer, String> entry = entryIterator.next();
              if(!keysToKeep.contains(entry.getKey())) {
                  entryIterator.remove();
              }
          }
      

      【讨论】:

      • 这个解决方案对我有用。但问题是我的编译器是 1.7,我不能将它更新到 1.8。那么我怎样才能在 1.7 上做类似的事情呢?
      • 您可以使用 entrySet 的迭代器并将其删除。请注意,您必须使用迭代器,否则如果您尝试从当前正在迭代的集合中删除元素,您将收到 ConcurrentModificationException。将其添加到我的答案中。
      【解决方案3】:

      出于性能考虑,您可以先确定您可以保留的密钥集是大还是小。如果它很小,您可以创建一个新的 HashMap 并在该新映射中分配键值对。否则,您可以迭代并删除那些不在集合中的内容,如下所示:

      for (Map.Entry<String, String> entry : map.entrySet()) {
         if (keySet.contains(entry.getKey())) {
           entry.remove();
         }
      }
      

      【讨论】:

      • 如果你尝试运行它,你会得到一个 java.util.ConcurrentModificationException。如果不使用迭代器,您将无法修改集合。
      • for (var it = map.entrySet().iterator(); it.hasNext();) { var entry = it.next(); if (keySet.contains(entry.getKey())) { it.remove(); } }
      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2014-05-15
      • 2022-01-01
      • 2016-08-02
      相关资源
      最近更新 更多