我有一个 Map<String, ArrayList>
和一个 Set<String>
,是否有一种方法可以将映射的键与字符串集合进行“交集”,以便只保留具有给定键的键值对,而无需遍历整个映射?我的主要关注点是性能和避免在可以更加优美完成的情况下重新发明轮子。
我有一个 Map<String, ArrayList>
和一个 Set<String>
,是否有一种方法可以将映射的键与字符串集合进行“交集”,以便只保留具有给定键的键值对,而无需遍历整个映射?我的主要关注点是性能和避免在可以更加优美完成的情况下重新发明轮子。
只需要这样做:
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}
对 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}
KeySet
支持retainAll
。太有用了。 - Paul Draper