根据键的子集过滤映射的元素,而不必遍历整个事物
我有一个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}