加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 展平集合的地图

发布时间:2020-12-16 09:50:34 所属栏目:安全 来源:网络整理
导读:我试图压扁一个地图,其中的键是可穿越的,在这个意义上: 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 pair
我试图压扁一个地图,其中的键是可穿越的,在这个意义上:

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,6) -> 'B')
val fused2 = fuse[Int,Char,Set[Int]](map2)

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

P.S.:当关键遍历具有非空交点时,该保险丝功能没有多大意义.

解决方法

就像@Azzie一样,我在想拉链,但也许Azzie有这些优点.

scala> val m = Map( Set(1,6) -> 'B')
m: scala.collection.immutable.Map[scala.collection.immutable.Set[Int],Char] = Map(Set(1,3) -> A,6) -> B)

scala> (m map { case (k,v) => k zip (Stream continually v) }).flatten.toMap
res0: scala.collection.immutable.Map[Int,Char] = Map(5 -> B,4 -> B)

scala> (m map { case (k,v) => k zipAll (Nil,null,v) }).flatten.toMap
res1: scala.collection.immutable.Map[Any,4 -> B)

scala> m flatMap { case (k,v) => k zip (Stream continually v) }
res2: scala.collection.immutable.Map[Int,4 -> B)

如何很好地概括它并不明显.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读