Scala编程基础9:Scala循环

2020-04-08  本文已影响0人  金字塔下的小蜗牛

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

image

1.循环类型

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

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 键来中断无限循环。

上一篇下一篇

猜你喜欢

热点阅读