一段练习的代码

原本的例子是一个不算复杂的功能:删除数组中第一个负数之后的所有负数。

比如:

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
}

)
}
}

功能是实现了,但是“简洁”两个字就别提了。。。
后面会想办法优化这段代码。欢迎大牛莅临指导,先在此谢过~

猜你喜欢

转载自www.cnblogs.com/rabbit624/p/10538257.html