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

scala – 用于嵌套集合的zipWithIndex(没有可变状态的发布)

发布时间:2020-12-16 10:06:36 所属栏目:安全 来源:网络整理
导读:有一些嵌套集合: val xs = List( List("a","b"),List("c"),List("d","e","f")) 我想为嵌套列表的元素创建唯一索引: val result = List( List(("a",0),("b",1)),List(("c",2)),List(("d",3),("e",4),("f",5))) 这是一个糟糕的解决方案(使用可变状态): val
有一些嵌套集合:

val xs = List(
           List("a","b"),List("c"),List("d","e","f"))

我想为嵌套列表的元素创建唯一索引:

val result = List(
         List(("a",0),("b",1)),List(("c",2)),List(("d",3),("e",4),("f",5)))

这是一个糟糕的解决方案(使用可变状态):

val indexes:List[Int] = xs.flatten.zipWithIndex.map(_._2)
var idx = 0
val result = xs.map(_.map{ el =>
   val copy = (el,indexes(idx))
   idx = idx + 1
   copy
})

如何在没有可变状态的情况下发布此任务?

解决方法

解决方案1(使用折叠):

scala> xs.foldLeft((List[List[(String,Int)]](),0)){ 
         case ((r,i),x) => (r:+x.zip(Stream.from(i)),i+x.size) 
       }._1
res1: List[List[(String,Int)]] = List(List((a,(b,List((c,List((d,(e,(f,5)))

解决方案2(使用递归)

scala> def deepZip[A](ls: List[List[A]],i: Int = 0): List[List[(A,Int)]] = ls match {
     |   case Nil => Nil
     |   case x::xs => x.zip(Stream.from(i)) :: deepZip(xs,i+x.size)
     | }
deepZip: [A](ls: List[List[A]],i: Int)List[List[(A,Int)]]

scala> deepZip(xs)
res2: List[List[(String,5)))

解决方案3:

scala> (xs,xs.map(_.size).scanLeft(0){ _+_ }).zipped map { (a,b) => a.zip(Stream.from(b)) }
res3: List[List[(String,5)))

(编辑:李大同)

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

    推荐文章
      热点阅读