Remove all negative numbers after the first negative number in the array
Scala > val a = ArrayBuffer [Int] (1,2pint 3,5,-1,2,3,5) a: scala.collection.mutable.ArrayBuffer [Int] = ArrayBuffer (1,2pint 3,5,1,2,3,5) scala >: paste// Entering paste mode (ctrl-D tofinish) var foundFirstNegative = falseval keepIndexes = for (I 0) # indicates 1yield {if (a (I) < 0) foundFirstNegative = true I # description 2} for (I ares4:scala.collection.mutable.ArrayBuffer [Int] = ArrayBuffer (1,2,3,5,-1,2)
Algorithm description: avoid the traditional multiple moving array, multiple remove, the advantage of the above code design is to find out the elements that do not meet the conditions index, and then delete these elements.
Explanation 1: the first negative number and all positive numbers will pass through the if guard
Note 2: the first negative number goes through the if guard, enters the description 2 code, and sets foundFirstNegative to true. The subsequent negative number cannot pass the if guard part, and I and if are independent and are not surrounded by blocks.
Note 3: set the first keepIndexes.length elements in a to the corresponding integer and the first negative number
Note 4: delete the elements after the keepIndexes.length-1 position in a, and the rest are the required elements.