1. 程式人生 > >一段練習的代碼

一段練習的代碼

下標 簡潔 str begin length bre 掃描 for remove

原本的例子是一個不算復雜的功能:刪除數組中第一個負數之後的所有負數。

比如:

val a = scala.collection.mutable.ArrayBuffer[Int]()
a += (23,44,67,55,39,7,-5,-17,-33,66,77,88,-12,-15,99,-46,-57,-70,90,-11,-26,-49,-55)
想要得到結果:
a = (23,44,67,55,39,7,-5,66,77,88,99,90)

這個功能用一段比較簡潔的代碼就可以實現了。但是我非要自己給自己找別扭,想實現這樣的結果:
a = (23, 44, 67, 55, 39, 7, -5, 66, 77, 88, -12, 99, -46, 90, -11)
於是就出現了下面這樣一坨代碼:
import scala.util.control.Breaks

object TrimArray3 {
def main(args: Array[String]): Unit = {
val a = scala.collection.mutable.ArrayBuffer[Int]()
a += (23,44,67,55,39,7,-5,-17,-33,66,77,88,-12,-15,99,-46,-57,-70,90,-11,-26,-49,-55)

var begIndx = 0
var exit = 0
Breaks.breakable(

while (exit < a.length) {
//第一個負數出現在第六個位置,下一次從第七個位置開始掃描,不再從0開始掃描。否則每次掃描到的begIndx都是6
val indx = for(i <- begIndx until a.length if a(i) < 0) yield i

//掃描到末尾了(後面沒有負數了),跳出while循環,否則報錯:下標越界
if(indx == Nil) Breaks.break()

println(indx)
var sum = 0
var
tmp = indx(0)

begIndx = tmp + 1

//如果下標連續,說明是同一段連續的負數,計數得到這一段有幾個負數,一起remove掉
//設置一個標誌,如果發現下標不連續了就不再做空循環了
var flag = true
for(j <- 1 until indx.length if flag){

var tmp1 = indx(j)
if (tmp + 1 == tmp1) {
sum += 1
tmp = tmp1

} else {
//發現下標不連續了,跳出循環
flag = false
}

}
a.remove(begIndx,sum)
println(a)
println(begIndx)
exit += 1
}

)
}
}

功能是實現了,但是“簡潔”兩個字就別提了。。。
後面會想辦法優化這段代碼。歡迎大牛蒞臨指導,先在此謝過~

一段練習的代碼