基于其键的子集过滤地图的元素,而不迭代整个事物

时间:2011-07-18 20:38:33

标签: java collections map set intersection

我有Map<String, ArrayList>Set<String>。有没有办法将地图的键与字符串集“相交”,以便只保留具有给定键的对,而不迭代整个地图?我主要担心的是性能并重新发明了可以更优雅地完成工作的轮子。

2 个答案:

答案 0 :(得分:111)

只是做:

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}

答案 1 :(得分:9)

详细阐述了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}