zoukankan      html  css  js  c++  java
  • 一段练习的代码

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

    比如:

    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
    }

    )
    }
    }

    功能是实现了,但是“简洁”两个字就别提了。。。
    后面会想办法优化这段代码。欢迎大牛莅临指导,先在此谢过~
  • 相关阅读:
    HDU 2822 Dogs【两次bfs】
    HDU 2819 Swap【二分图|启发题】
    HDU 2818 Building Block【并查集+根节点偏移量】
    HDU 2817 A sequence of numbers【水题|快速幂】
    Linux内核分析--操作系统是如何工作的
    讲座感想
    用eclipse开发和调试postgresql-8.4.1
    Ubuntu 14.04下翻译软件的安装与比较
    Linux下autoconf和automake使用
    github 使用网址
  • 原文地址:https://www.cnblogs.com/rabbit624/p/10538257.html
Copyright © 2011-2022 走看看