根据键的子集过滤映射的元素,而无需迭代整个事物

发布于 2024-11-24 21:02:24 字数 170 浏览 0 评论 0原文

我有一个 Map 和一个 Set。有没有办法将映射的键与字符串集“相交”,以便仅保留具有给定键的对,而不迭代整个映射?我主要关心的是性能和重新发明轮子,让事情可以更优雅地完成。

I have a Map<String, ArrayList> and a Set<String>. Is there a way to "intersect" the keys of the map with the set of strings such that only the pairs with the given key remain, without iterating over the entire map? My main concern is performance and re-inventing the wheel on something that can be done more elegantly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

攒眉千度 2024-12-01 21:02:24

就这样做:

map.keySet().retainAll(set);

按照 javadoc,键集中的更改会反映在地图中。

...集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。 ...

这是一个演示:

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}

Just do:

map.keySet().retainAll(set);

As per the javadoc, the changes in the key set are reflected back in the map.

... The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. ...

Here's a demo:

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}
难理解 2024-12-01 21:02:24

详细阐述 BalusC 的出色答案,values() 也支持 keepAll():

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}

Elaborating on BalusC's excellent answer, values() supports retainAll() as well:

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 retains duplicate values as well, as you would expect:

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}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文