scala> val a = ArrayBuffer[Int](1, 2,3, 5, -1, 2, -3, -5) a: scala.collection.mutable.ArrayBuffer[Int]= ArrayBuffer(1, 2, 3, 5, -1, 2, -3 , -5) scala> :paste // Entering paste mode (ctrl-D tofinish) var foundFirstNegative = false val keepIndexes = for (i <- 0 untila.length if !foundFirstNegative || a(i) > 0) # 说明1 yield { if (a(i) < 0) foundFirstNegative =true; i # 说明2 } for (i <- 0 until keepIndexes.length)a(i) = a(keepIndexes(i)) # 说明3 a.trimEnd(a.length - keepIndexes.length)# 说明4 // Exiting paste mode, now interpreting. foundFirstNegative: Boolean = true keepIndexes:scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 5) scala> a res4:scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 5, -1, 2)
算法说明:避免传统多次移动数组,多次remove,上述代码设计优点在于统一找出不满足条件的元素index,然后统一删除这些元素。
说明1:第一个负数和所有正数都会通过if守卫;
说明2:第一个负数通过if守卫,进入说明2代码,将foundFirstNegative置为true,后续的负数则通不过if守卫部分,且i和if是独立的,并未使用块包围;
说明3:将a中前keepIndexes.length个元素置为对应的整数和第一个负数;
说明4:删掉a中keepIndexes.length – 1位置后面的元素,剩下的即为所求元素。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/197172.html