将地图[长,设置[长])反转为地图[长,长]

时间:2017-01-12 20:22:30

标签: scala

尝试将Map[Long, Set[Long]]转换为Map[Long, Long]

我尝试了这个,但遇到了编译问题:

m.map(_.swap).map(k => k._1.map((_, k._2)))

示例:

Map(10 -> Set(1,2,3), 11 -> Set(4,5))

应该成为:

Map(1 -> 10,
    2 -> 10,
    3 -> 10,
    4 -> 11,
    5 -> 11)

4 个答案:

答案 0 :(得分:3)

flatMap上的{p> Map[A,B]将会#34;正常工作"与元组集合:

m.flatMap {case (k,v) => v.map(_ -> k)} // Map[Long,Long]

Map[Long,Set[Long]]转到一系列Set[(Long,Long)],并将其展平为Map[Long,Long]

答案 1 :(得分:1)

澄清一下,看起来你有这个:

firebase.initializeApp(config).

你想在另一张地图中转换这张地图,但是有这样的东西:

Map(10 -> Set(1,2,3), 11 -> Set(4,5))

正如您可以看到这些集合是否不相交,结果地图中的某些键丢失了:

考虑到这一点,代码将如下所示:

Map(1 -> 10,
    2 -> 10,
    3 -> 10,
    4 -> 11,
    5 -> 11)

答案 2 :(得分:1)

这会将Map mMap[Long, Set[Long]]转换为Map[Long, List[Long]]

m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.map(_._2)}

您尚未指定当不同Set值包含某些相同Long s(即Map(8 -> Set(1,2), 9 -> Set(2,3)))时应发生的情况。如果你确定没有发生,你可以使用以下调整。

m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.head._2}

甚至更简单:

m.flatten {case(k, vs) => vs.map((_, k))}.toMap

答案 3 :(得分:1)

假设inMap[Long, Set[Long]]

in./:(Map.empty[Long, Long]) { case (acc, (key, values)) => acc ++ values.map(_ -> key) }