gpt4 book ai didi

scala - 如何将元组元组的序列转换为映射元组

转载 作者:行者123 更新时间:2023-12-02 04:45:51 26 4
gpt4 key购买 nike

我有一个数据序列,我想将其转换成一对 map ;每个映射代表原始序列的单独转换。我可以生成元组,这些元组将在原始输入序列的单次传递中构成每个映射,如下所示:

val entries: Seq[((A, B), (A, C))] = input map { x =>
val key = genKey(x)
val tuple1 = key -> f(x)
val tuple2 = key -> g(x)
}

我可以通过遍历生成的序列两次来单独创建每个映射,如下所示:

val map1 = (entries map { case(e1, _) => e1 }).toMap
val map2 = (entries map { case(_, e2) => e2 }).toMap

我想可能有一种方法可以在 map 上一次传递完成整个转换,这样我就可以做这样的事情:

val (map1, map2) = (entries accumulate { case(e1, e2) => // add e1 to map1, add e2 to map2 })

foldLeft 可能会做到这一点,但也许还有更优雅的东西?

最佳答案

使用标准库:

val (map1, map2) = entries.unzip match {
case (pairs1, pairs2) => (pairs1.toMap, pairs2.toMap)
}

Scalaz它是单行的:

val (map1, map2) = entries.unzip.bimap(_.toMap, _.toMap)

不过,这两种解决方案都会创建两个额外的中间序列。这可能不是你需要担心的事情,但如果你真的想避免它,折叠实际上一点也不优雅:

val (map1, map2) = entries.foldLeft(Map.empty[A, B], Map.empty[A, C]) {
case ((map1, map2), (pair1, pair2)) => (map1 + pair1, map2 + pair2)
}

不需要 Scalaz。

关于scala - 如何将元组元组的序列转换为映射元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com