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

dav*_*ave 52 java collections intersection map set

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

Bal*_*usC 117

做就是了:

map.keySet().retainAll(set);
Run Code Online (Sandbox Code Playgroud)

根据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}
Run Code Online (Sandbox Code Playgroud)

  • 哇.从来不知道`KeySet`支持`retainAll`.太有用了. (3认同)

Sid*_*tha 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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)