gpt4 book ai didi

scala - 展平集合映射

转载 作者:行者123 更新时间:2023-12-04 23:21:18 25 4
gpt4 key购买 nike

我试图展平一个 map ,其中键是可遍历的,从某种意义上说:

Map( Set(1, 2, 3) -> 'A', Set(4, 5, 6) -> 'B')

应该扁平化为:
Map(5 -> B, 1 -> A, 6 -> B, 2 -> A, 3 -> A, 4 -> B)

这是我所做的:
def fuse[A, B, T <: Traversable[A]](mapOfTravs: Map[T, B]): Map[A, B] = {
val pairs = for {
trav <- mapOfTravs.keys
key <- trav
} yield (key, mapOfTravs(trav))
pairs.toMap
}

有用。但:
  • 有没有更简单的方法来做到这一点?
  • 我对 Scala 类型系统不是很满意,我相信这可以改进。每当我使用我的函数时,我都必须明确指定类型:
    val map2 = Map( Set(1, 2, 3) -> 'A', Set(4, 5, 6) -> 'B')
    val fused2 = fuse[Int, Char, Set[Int]](map2)

    val map1: Map[Traversable[Int], Char] = Map( Set(1, 2, 3) -> 'A', Set(4, 5, 6) -> 'B')
    val fused1 = fuse[Int, Char, Traversable[Int]](map1)

  • P.S.:这个 fuse当关键可遍历项具有非空交集时,函数没有多大意义。

    最佳答案

    这基本上就是你在理解中所做的,但稍微简化了一点:

      def fuse[A, B, T <: Traversable[A]](mapOfTravs: Map[T, B]): Map[A, B] = {
    mapOfTravs.flatMap({ case (s, c) => s.map(i => i -> c) })
    }

    你对这些类型无能为力,我确定你可以做一些类型的 lambda 恶作剧,我只是不知道该怎么做......

    更新
    这是一个稍微好一点的版本,与上面的 flatMap 相同:
      def fuse2[A, B, T <: Traversable[A]](mapOfTravs: Map[T, B]): Map[A, B] = {
    for {
    (keys, value) <- mapOfTravs
    key <- keys
    } yield key -> value
    }

    关于scala - 展平集合映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25880797/

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