基于一个键的子集,过滤地图元素而无需遍历整个地图。

62

我有一个 Map<String, ArrayList> 和一个 Set<String>,是否有一种方法可以将映射的键与字符串集合进行“交集”,以便只保留具有给定键的键值对,而无需遍历整个映射?我的主要关注点是性能和避免在可以更加优美完成的情况下重新发明轮子。

2个回答

141

只需要这样做:

map.keySet().retainAll(set);

根据Javadoc,键集合的更改会反映在地图中。

... 该集合由映射支持,因此对地图的更改会反映在集合中,反之亦然。 ...

这是一个演示:

var map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

var set = new HashSet<String>();
set.add("1");
set.add("3");

map.keySet().retainAll(set);

System.out.println(map); // {1=one, 3=three}

4
哇,从来不知道 KeySet 支持 retainAll。太有用了。 - Paul Draper
自从1.1版本以来,我一直在使用集合,但我也不知道这一点。 - WestCoastProjects
非常有用。values() 也支持这一点。 - Siddhartha

13

对 BalusC 卓越的回答进行详细阐述,values() 也支持 retainAll():

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);   // prints {1=one, 2=two}

retainAll 方法也会保留重复值,这是预期的行为:

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "two");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);  // prints {1=one, 2=two, 4=two}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接