java 根据Map键的子集过滤Map的元素,而无需遍历整个Map

xmakbtuz  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(134)

我有一个Map<String, ArrayList>和一个Set<String>,有没有一种方法可以将map的键与字符串集“相交”,这样就只保留具有给定键的键对,而不需要迭代整个map?我主要关心的是性能和重新发明轮子,以便更优雅地完成一些事情。

u3r8eeie

u3r8eeie1#

只需:

map.keySet().retainAll(set);

按照javadoc,键集中的更改将反映回Map中。
...集合由Map支持,因此对Map的更改会反映在集合中,反之亦然...
下面是一个演示:

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}
yb3bgrhw

yb3bgrhw2#

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

相关问题