在 Scala 中反转/转置一对多映射
将 Map[A, Set[B]]
转换为 Map[B, Set[A]]
的最佳方法是什么?
例如,如何将 a 转换
Map(1 -> Set("a", "b"),
2 -> Set("b", "c"),
3 -> Set("c", "d"))
为 a
Map("a" -> Set(1),
"b" -> Set(1, 2),
"c" -> Set(2, 3),
"d" -> Set(3))
(我仅在这里使用不可变集合。我真正的问题与字符串或整数无关。:)
What is the best way to turn a Map[A, Set[B]]
into a Map[B, Set[A]]
?
For example, how do I turn a
Map(1 -> Set("a", "b"),
2 -> Set("b", "c"),
3 -> Set("c", "d"))
into a
Map("a" -> Set(1),
"b" -> Set(1, 2),
"c" -> Set(2, 3),
"d" -> Set(3))
(I'm using immutable collections only here. And my real problem has nothing to do with strings or integers. :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
在 aioobe 和 Moritz 的帮助下:
如果你显式调用 contains ,它会更具可读性:
with help from aioobe and Moritz:
It's a bit more readable if you explicitly call contains:
到目前为止我想出的最好的是
Best I've come up with so far is
或者使用折叠的另一种:
Or another one using folds:
这是一个单语句解决方案
这一点相当整齐 (*) 生成构造反向映射所需的元组
,将
其直接转换为映射会覆盖与重复键对应的值,尽管
添加
.groupBy{_._1}
得到这个更接近的。将这些列表变成后半对的集合。
给出
QED :)
(*) YMMV
Here's a one statement solution
This bit rather neatly (*) produces the tuples needed to construct the reverse map
produces
Converting it directly to a map overwrites the values corresponding to duplicate keys though
Adding
.groupBy{_._1}
gets thiswhich is closer. To turn those lists into Sets of the second half of the pairs.
gives
QED :)
(*) YMMV
一个简单但可能不是超级优雅的解决方案:
A simple, but maybe not super-elegant solution:
我能想到的最简单的方法是:
The easiest way I can think of is: