在Scala中将元素插入到有序数组中的最佳方法

时间:2018-01-18 20:04:25

标签: arrays scala sorting

我有一个数组,或者Seq看起来像

val myArray = collection.mutable.ArrayBuffer[Int](1,4,8,10,12,13)

val newElem = 7

我想将新元素插入到正确位置的Array中,以便仍然可以对数组进行排序。

我不想在这里生成新阵列。

我的解决方案是首先找到插入位置,然后插入它。

def findInsertPosition(myArray: collection.multable.ArrayBuffer[Int], newElem: Int): Int

然后致电

myArray.insert(pos, newElem)

问题是如何在Scala样式中编写findInsertPosition函数,而不使用while,for循环?

或者你有更好的解决方案吗?

4 个答案:

答案 0 :(得分:4)

使用lastIndexWhere找到插入位置,然后在该位置添加一个insert

scala> val xs = scala.collection.mutable.ArrayBuffer(1,4,8,10,12,13)
xs: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 8, 10, 12, 13)

scala> xs.insert(xs.lastIndexWhere(_ < 7) + 1, 7)

scala> xs
res10: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 7, 8, 10, 12, 13)

答案 1 :(得分:1)

这可能有点低效,但它有效:

def findInsertPosition(myArray: collection.mutable.ArrayBuffer[Int], newElem: Int): Int =
  myArray.takeWhile(_ < newElem).size

插入时它将是正确的索引。

答案 2 :(得分:1)

我想到的第一件事是:

myArray.insert(
  Stream.range(0, myArray.length)
    .find(a(_) >= newElem)
    .getOrElse(myArray.length), 
  newElem)

另一种方法类似于Brian的回答

myArray.insert(
  myArray.indexWhere(_ >= newElem),
  newElem)

答案 3 :(得分:1)

找到正确的索引点并插入。

val idx = myArray.indexWhere(_>newElem)
myArray.insert(if (idx<0) myArray.length else idx, newElem)
// ArrayBuffer(1, 4, 7, 8, 10, 12, 13)