在Scala中反转/转置一对多地图

aio*_*obe 15 collections scala map

将a Map[A, Set[B]]变为a 的最佳方法是Map[B, Set[A]]什么?

例如,我该怎么转

Map(1 -> Set("a", "b"),
    2 -> Set("b", "c"),
    3 -> Set("c", "d"))
Run Code Online (Sandbox Code Playgroud)

进入

Map("a" -> Set(1),
    "b" -> Set(1, 2),
    "c" -> Set(2, 3),
    "d" -> Set(3))
Run Code Online (Sandbox Code Playgroud)

(我在这里只使用不可变集合.而我真正的问题与字符串或整数无关.:)

Set*_*sue 10

在aioobe和Moritz的帮助下:

def reverse[A, B](m: Map[A, Set[B]]) =
  m.values.toSet.flatten.map(v => (v, m.keys.filter(m(_)(v)))).toMap
Run Code Online (Sandbox Code Playgroud)

如果明确调用contains,它会更具可读性:

def reverse[A, B](m: Map[A, Set[B]]) =
  m.values.toSet.flatten.map(v => (v, m.keys.filter(m(_).contains(v)))).toMap
Run Code Online (Sandbox Code Playgroud)

  • @aioobe然后你可以更进一步,把它写成`m.values.toSet.flatten.map(v =>(v,m.keys.filter(m(_)(v)))).toMap` - I认为它是尽可能短的(如[Set [A] <:( A => Boolean)`). (2认同)