在Scala中合并两个相邻指标的最有效方法是什么?我想到的是一个讨厌的循环复制。
例如,有一个缓冲区数组A,长度为N.需要生成新数组,以便A(i) = A(i) + A(i+1)
,i < N
例如,合并和求和第二个和第三个元素,并生成一个新数组。
ArrayBuffer(1,2,4,3) => ArrayBuffer(1,6,3)
更新: 我想我想出了一些解决方案,但不喜欢它。任何改善的建议都将受到高度赞赏。
scala> val i = 1
i: Int = 1
scala> ArrayBuffer(1,2,4,3).zipWithIndex.foldLeft(ArrayBuffer[Int]())( (k,v)=> if(v._2==i+1){ k(k.length-1) =(k.last+v._1);k; }else k+= v._1 )
答案 0 :(得分:3)
获得邻居的最简单方法是使用sliding
方法。
a.sliding(2, 1).map(_.sum)
其中第一个参数是大小,第二个参数是步。
如果你想保持第一个和最后一个元素完整,那么这样的东西应该有效:
a.head +: a.drop(1).dropRight(1).sliding(2, 1).map(_.sum).toArray :+ a.last
如果你想避免在append / prepend上复制和数组,你可以按如下方式重写它:
val aa = a.sliding(2, 1).map(_.sum).toArray
aa(0) = a.head
aa(aa.size - 1) = a
或使用提供常量时间前置和追加的ListBuffer。
也可以使用Iterators
:
val middle: Iterator[Int] = a.drop(1).dropRight(1).sliding(2, 1).map(_.sum)
(Iterator(a.head) ++ middle ++ Iterator(a.last)).toArray // or toBuffer