我有一个数组,或者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循环?
或者你有更好的解决方案吗?
答案 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)