【问题标题】:Remove multiple keys from Map in efficient way?以有效的方式从 Map 中删除多个键?
【发布时间】:2013-07-14 14:10:08
【问题描述】:

我有一个带有大量键值对的Map<String,String>。现在我想从Map 中删除选定的键。以下代码显示了我为实现这一目标所做的工作。

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

然后:

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

这工作正常。更好的方法是什么?

【问题讨论】:

    标签: java dictionary


    【解决方案1】:

    假设您的集合包含您要删除的字符串,您可以使用the keySet methodmap.keySet().removeAll(keySet);

    keySet 返回此映射中包含的键的 Set 视图。集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

    人为的例子:

    Map<String, String> map = new HashMap<>();
    map.put("a", "");
    map.put("b", "");
    map.put("c", "");
    
    Set<String> set = new HashSet<> ();
    set.add("a");
    set.add("b");
    
    map.keySet().removeAll(set);
    
    System.out.println(map); //only contains "c"
    

    【讨论】:

    • 您的建议很棒。我猜 removeAll(keySet) 正在做我在那里所做的事情
    • 就“效率”而言,它可能只是下面的一个 for 循环,但就更简洁的代码而言,不错的胜利:)
    • 一见即知 - 谢谢!仍然让我感到困惑,为什么 Map 确实有 removeAll,因此不能直接通过 entrySet 迭代
    【解决方案2】:

    为了完成,并且当您寻找实现此目标的方法时,Google 会将您带到这里:

    map.entrySet().removeIf(entry -> /* decide what you want to remove here */ );
    

    这并不假定您有一组预定义的键要删除,而是假定您有一个条件,在该条件下应该删除这些键。从问题来看,尚不清楚这些键是手动添加还是基于某种条件。在后一种情况下,这可能是更简洁的代码。

    对于前一种情况,这个(未经测试的)代码也可以工作:

    map.entrySet().removeIf(entry -> keySet.contains(entry.getKey()) );
    

    但显然the answer provided by @assylias 在这种情况下要干净得多!

    【讨论】:

      【解决方案3】:

      为了完整起见:

      正如猜测的 java.util.AbstractSet#removeAll 确实迭代了所有条目,但有一个小技巧:它使用较小集合的迭代器:

      if (size() <= collection.size()) {
          Iterator<?> it = iterator();
          while (it.hasNext()) {
              if (collection.contains(it.next())) {
                  it.remove();
              }
          }
      } else {
          Iterator<?> it = collection.iterator();
          while (it.hasNext()) {
              remove(it.next());
          }
      }
      

      【讨论】:

        【解决方案4】:

        使用 Java 流:

        keySet.forEach(map::remove);
        

        【讨论】:

        • 这并不能解决删除多个选定键的实际请求,因为它没有选择参数。
        • @dildeepak,“选择参数”是什么意思?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多