美文网首页
Scala编程基础9:Scala循环

Scala编程基础9:Scala循环

作者: 金字塔下的小蜗牛 | 来源:发表于2020-04-08 08:16 被阅读0次

    有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着执行第二个语句,以此类推。编程语言提供了更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或者语句块,下面是大多数编程语言中循环语句的执行流程图:

    image

    1.循环类型

    Scala语言提供了以下几种循环类型:

    • while循环:先判断循环条件,若为真,执行一遍循环代码块,然后再判断循环条件….直到循环条件为假,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。
    • do-while循环:先执行一遍循环代码块,然后判断循环条件,若为真,继续执行一遍代码块,然后再判断循环条件….直到循环条件为假,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。
    • for循环:需要指定循环计数器,在指定的范围内执行循环代码块,若计数器结束,或者代码内部遇到满足条件的Breaks.break语句,跳出循环。

    1.1 while循环

    Scala语言中的while循环的格式如下:

    while(condition)
    { statement(s);
    }

    其中,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为 true,当条件为 true 时执行循环体; 当条件为 false 时,退出循环,继续执行后续代码。

    while循环的流程图如下所示:

    image

    注意:while 循环的特点是先判断循环条件,若条件直接为假,则循环体一次都不会被执行。

    下面是一个while循环的例子:编辑Test1.scala文本文件,内容如下:

    object Test1 {
        def main(args:Array[String]) {
            var a = 10;
            while(a > 0){
                println(a+" ");
                a = a - 1;
            }
            println();
        }
    }
    

    编译并执行Test1.scala文件,结果如下:

    E:\Scala>scalac Test1.scala
    E:\Scala>scala Test1
    10 9 8 7 6 5 4 3 2 1

    1.2 do-while循环

    不像 while 循环在循环头部测试循环条件, do-while 循环是在循环的尾部检查它的条件。do-while 循环与 while 循环类似,但是 do-while 循环会确保至少执行一次循环。do-while循环的格式如下:

    do {
    statement(s);
    } while( condition );

    其中,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为 true,当条件为 true 时执行循环体; 当条件为 false 时,退出循环,继续执行后续代码。

    do-while循环的流程图如下所示:

    image

    注意:do-while的条件表达式出现在循环的尾部,所以循环中的 statement(s) 至少会被执行一次。

    下面是一个do-while循环的例子:编辑Test2.scala文本文件,内容如下:

    object Test2 {
        def main(args: Array[String]) {
            var a = 10;
            do{
                print( a + " " );
                a = a + 1;
            }while(a < 20);
            println();
        }
    }
    

    编译并执行Test2.scala文件,结果如下:

    E:\Scala>scalac Test2.scala
    E:\Scala>scala Test2
    10 11 12 13 14 15 16 17 18 19

    1.3 for循环

    for 循环允许编写一个执行指定次数的循环控制结构。格式如下:

    for( var x <- Range ) { statement(s);
    }

    其中,Range 可以是一个数字区间表示 i to j ,或者 i until j。左箭头 <- 用于为变量 x 赋值。

    举个例子:以下是一个使用了i to j语法(包括j)的for循环的实例:

    object Test3 {
        def main(args: Array[String]) {
            var a = 0;
            for( a <- 1 to 10) {
                print(a + " ");
            }
            println();
        }
    }
    

    编译并执行Test3.scala文件,结果如下:

    E:\Scala>scalac Test3.scala
    E:\Scala>scala Test3
    1 2 3 4 5 6 7 8 9 10

    以下是一个使用了i until j语法(不包括j)的for循环的实例:

    object Test4 {
        def main(args: Array[String]) {
            var a = 0;
            for( a <- 1 until 10) {
                print(a + " ");
            }
            println();
        }
    }
    

    编译并执行Test4.scala文件,结果如下:

    E:\Scala>scalac Test4.scala
    E:\Scala>scala Test4
    1 2 3 4 5 6 7 8 9

    在for循环中还可以使用分号[;]来设置多个区间,它将迭代给定区间内所有的可能值。以下实例演示了两个区间的for循环的实例:

    object Test5 {
        def main(args: Array[String]) {
            var a = 0;
            var b = 0;
            for( a <- 1 to 3; b <- 4 to 7) {
                println("a = " + a + ", b = " + b);
            }
        }
    }
    

    编译并执行Test5.scala文件,结果如下:

    E:\Scala>scalac Test5.scala
    E:\Scala>scala Test5
    a = 1, b = 4
    a = 1, b = 5
    a = 1, b = 6
    a = 1, b = 7
    a = 2, b = 4
    a = 2, b = 5
    a = 2, b = 6
    a = 2, b = 7
    a = 3, b = 4
    a = 3, b = 5

    a = 3, b = 6
    a = 3, b = 7

    1.4 for循环集合

    for循环集合的格式如下:

    for( var x <- List ){

    statement(s);
    }

    以上语法中, List 变量是一个集合,for 循环会迭代所有集合的元素。

    举个例子:

    以下实例将循环遍历数字集合。我们使用 List() 来创建集合。在以后章节我们会详细介绍集合。

    object Test6 {
        def main(args: Array[String]) {
            var a = 0;
            var numList = List(1,2,3,4,5,6);
            for( a <- numList ) {
                print(a + " ");
            }
            println();
        }
    }
    

    编译并执行Test6.scala文件,结果如下:

    E:\Scala>scalac Test6.scala
    E:\Scala>scala Test6
    1 2 3 4 5 6

    1.5 for循环过滤

    Scala 可以使用一个或多个 if 语句来过滤一些元素。以下是在 for 循环中使用过滤器的语法:

    for( x <- List
    if condition1; if condition2...
    ){
    statement(s);
    }

    举个例子:以下是 for 循环中过滤的实例:

    object Test7 {
        def main(args: Array[String]) {
            var a = 0;
            var numList = List(1,2,3,4,5,6,7,8,9,10);
            for( a <- numList
                 if a != 3; if a < 8
            ) {
                print(a + " ");
            }
            println();
        }
    }
    

    编译并执行Test7.scala文件,结果如下:

    E:\Scala>scalac Test7.scala
    E:\Scala>scala Test7
    1 2 4 5 6 7

    1.6 for使用yield

    可以将 for 循环的返回值作为一个变量存储。语法格式如下:

    var retVal = for { var x <- List
    if condition1; if condition2...
    } yield x

    注意大括号中用于保存变量和条件,retVal 是变量, 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。

    举个例子:以下实例演示了 for 循环中使用 yield:

    object Test8 {
        def main(args: Array[String]) {
            var a = 0;
            var numList = List(1,2,3,4,5,6,7,8,9,10);
            var retVal = for { a <- numList
                               if a != 3; if a < 8
                             } yield a;
            for ( b <- retVal ){
                print(b + " ");
            }
            println();
        }
    }
    

    编译并执行Test8.scala文件,结果如下:

    E:\Scala>scalac Test8.scala
    E:\Scala>scala Test8
    1 2 4 5 6 7

    2.循环控制语句

    循环控制语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Scala 语言中默认是没有 break 语句,但是你在 Scala 2.8 版本后可以使用另外一种方式来实现 break 语句。当在循环中使用break 语句,在执行到该语句时,就会中断循环并执行循环体之后的代码块。Scala 中 break 的语法有点不大一样,格式如下:

    // 导入以下包
    import scala.util.control._ // 创建 Breaks 对象 val loop = new Breaks;
    // 在 breakable 中循环 loop.breakable{
    // 循环
    for(...){
    ....
    // 循环中断 loop.break;
    }
    }

    下面是含有break语句的程序的流程图:

    image

    举个例子:以下是含有break语句的程序实例:

    import scala.util.control._
    object Test9 {
        def main(args: Array[String]) {
            var a = 0;
            val numList = List(1,2,3,4,5,6,7,8,9,10);
            val loop = new Breaks;
            loop.breakable {
                for( a <- numList ) {
                    print(a + " ");
                    if( a == 4 ) {
                        loop.break;
                    }
                }
                println();
            }
        }
    }
    

    编译并执行Test9.scala文件,结果如下:

    E:\Scala>scalac Test9.scala
    E:\Scala>scala Test9
    1 2 3 4

    以下实例演示了如何中断嵌套循环:

    import scala.util.control._
    object Test10 {
        def main(args: Array[String]) {
            var a = 0;
            var b = 0;
            val numList1 = List(1,2,3);
            val numList2 = List(11,12,13);
            val outer = new Breaks;
            val inner = new Breaks;
            outer.breakable {
                for( a <- numList1 ) {
                    print("a = " + a);
                    inner.breakable {
                        for(b <- numList2) {
                            print("b = " + b);
                            if(b == 12){
                                inner.break;
                            }
                        }
                    }
                }
            }
        }
    }
    

    编译并执行Test10.scala文件,结果如下:

    E:\Scala>scalac Test10.scala
    E:\Scala>scala Test10
    a = 1
    b = 11
    b = 12
    a = 2
    b = 11
    b = 12
    a = 3
    b = 11
    b = 12

    3.无限循环

    如果条件永远为 true,则循环将变成无限循环(死循环)。我们可以使用 while 语句来演示无限循环:

    object Test11 {
     def main(args: Array[String]) {
     var a = 1;
     while( true ) { print( a + " ");
     }
     }
    }
    

    编译并执行Test11.scala文件,结果如下:

    E:\Scala>scalac Test11.scala
    E:\Scala>scala Test11
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 终止批处理操作吗(Y/N)? y
    E:\Scala>

    以上代码执行后循环会永久执行下去,可以使用 Ctrl + C 键来中断无限循环。

    相关文章

      网友评论

          本文标题:Scala编程基础9:Scala循环

          本文链接:https://www.haomeiwen.com/subject/zajkdhtx.html