根据键的子集过滤映射的元素,而不必遍历整个事物

我有一个Map<String, ArrayList>和一个Set<String> 。 有没有一种方法可以将地图的键与string集“交叉”,从而只保留具有给定键的对,而不会迭代整个地图? 我主要关心的是performance,重新发明可以更优雅地完成的事情。

做就是了:

 map.keySet().retainAll(set); 

根据javadoc ,键集中的更改会反映回地图中。

…该集合由地图支持,所以对地图的更改反映在集合中,反之亦然。 …

这是一个演示:

 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("1"); set.add("3"); map.keySet().retainAll(set); System.out.println(map); // {3=three, 1=one} 

详细说明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} 

retailAll也会保留重复的值,如您所期望的那样:

 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}