在Scala中合并两个相邻指标的有效方法

时间:2015-09-20 11:38:17

标签: arrays scala

在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 )

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