大数据之脚踏实地学13--Scala控制流

2019-05-21 23:16:53 浏览数 (1)

还没关注?

快动动手指!

往期回顾

大数据之脚踏实地学12--Scala数据类型与运算符

大数据之脚踏实地学11--Spark神器的安装

大数据之脚踏实地学10--Hive独立式安装

Scala中的输入与输出

在Scala中经常会涉及到变量值的输入和输出,输入是指通过键盘将数据信息传送到Scala环境的内存中,输出则是指将内存中的数据返回到指定的地方(如电脑屏幕、本地文件或数据库等)。 两种输入方法

  • 通过等号赋值的方法,向变量中传递值
  • 调用scala.io.StdIn包中的read类函数,在屏幕中完成数据的输入

举例

代码语言:javascript复制
import scala.io.StdIn._  // 下划线代表StdIn包内的所有函数
object InPut {  
    def main(args: Array[String]): Unit = {
        // 方法一:等号赋值法
        val name : String = "刘顺祥"

        // 方法二:函数输入法
        println("请输入您的年龄:")
        val age = readInt()  // 输入不同数据类型的值,所使用的函数不一样

        println("亲爱的"   name   "先生,您的年龄为"   age   "岁")
    }
}

两种输出方法

  • 直接调用变量名的名称,但该方法只能在交互的REPL中执行
  • 借助于打印函数,该方法又可以衍生出三种用法,即:

a) println,结合加号( ),将多个内容进行连接并打印输出 b) println,传入表达式(表达式中所涉及的变量必须以美元符号作前缀), 其中表达式须用大括号框起来,同时需要在被打印对象的最前面加上字母s c) printf,格式化输出,类似于Python的用法

举例

代码语言:javascript复制
object OutPut {
    def main(args : Array[String]) : Unit = {
        val name = "刘顺祥"
        val balance = 6.52

        // 加号( )拼接法
        println("亲爱的"   name   "先生,您的话费余额为"   balance   "元。")
        // s表达式法
        println(s"亲爱的${name}先生,您的话费余额为${balance}元")
        // 格式化输出法 
        printf("亲爱的%s先生,您的话费余额为%.2f元n", name, balance)
    }
}

需要注意的是,在Scala中,打印函数println和print的区别在于前者打印完会自动换行,而后者却不能换行,如需换行必须在打印内容的结尾添加n。

Scala中的控制流

在Scala编程中,会经常使用到控制流技术,基于该技术,可以轻松地解决很多重复性的工作。本文主要分享有关控制流中的if分支、for循环和while循环。 if分支 if分支主要包含三种,分别是单分支、双分支和多分支,语法如下:

代码语言:javascript复制
// 单分支
if (condition) {
  expression
  }

// 双分支
if (condition) {
expression1
} else {
expression2
}

// 多分支(以三支为例)
if (condition1) {
expression1
} else if (condition2) {
expression2
} else {
expression3
}

举例

代码语言:javascript复制
import scala.io.StdIn

object IfBranch01 {
  def main(args: Array[String]): Unit = {
  // 判断用户是否登录成功
    println("请输入用户名:")
    val name = StdIn.readLine()
    println("请输入密码:")
    val passwd = StdIn.readLine()
    if (name == "scala" && passwd == "12345678") {
      println("登录成功!欢迎来到学习乐园")
    }

    // 判断学员是否通过科目二考试
    println("请输入您的考试成绩:")
    val score = StdIn.readInt()
    if (score >= 90) {
      println("恭喜您,考试合格!")
    } else {
      println("很遗憾,下次继续努力哦!")
    }

    // 根据用户的年龄,判断其所处的年龄段
    println("请输入您的年龄:")
    val age = StdIn.readInt()
    if (age < 18){
      println("未成年")
    } else if (age <= 45) {
      println("青壮年")
    } else if (age <= 65) {
      println("中老年")
    } else {
      println("老年")
    }
  }
}

我们再举一个嵌套的例子,假设某旅游区在设置票价时,按照如下规则:如果游客在旺季(3~10月份)来此地旅游,并且他是学生,则票价为80元,否则为150元;如果在淡季,学生票价为50元,否则为100元。该如何利用嵌套的if分支来完成呢?代码如下:

代码语言:javascript复制
object IfBranch02 {
  def main(args: Array[String]): Unit = {
    println("请输入月份:")
    val month = StdIn.readInt()
    println("请问是否为学生:")
    val is_student = StdIn.readLine()
    if (month >= 3 && month <= 10){
      if (is_student == "否") {
        println("您的票价是150元")
      } else {
        println("您的票价是80元")
      }
    } else {
      if (is_student == "否") {
        println("您的票价是100元")
      } else {
        println("您的票价是50元")
      }
    }
  }
}

for循环 for循环在某个迭代对象已知的情况下,执行的的重复性操作。语法如下:

代码语言:javascript复制
for (i <- iterable) {
      expression
    }

举例

代码语言:javascript复制
object ForLoop {
    def main(args: Array[String]): Unit = {
    // 统计1...100的所有偶数中,是3的倍数的个数,以及这些数的总和
    var counts = 0
    var sum = 0
    for (i <- 2 to 100 by 2) {
      if (i % 3 == 0) {
        counts  = 1
        sum  = i
      }
    }
    printf("1...100的偶数中,是3的倍数的个数为%d个n", counts)
    printf("这些数值的总和为%dn", sum)

    // 打印99乘法口诀
    for (i <- 1 to 9) {
      for (j <- 1 to i) {
        print(j   "*"   i   "="   (i*j)   "t")
      }
      println()
    }

    // 将列表中的每个元素做平方除以5的操作,并将运算结果保存到变量res中
    val X = List(10,8,23,17,7)
    val res = for (i <- X) yield {
      (i * i)/5.0
    }
    println("res = "   res)

   }
}

while循环 在前文介绍了for循环的使用,除此while循环也可以实现重复性操作。所不同的是,for循环主要解决已知可迭代对象的循环问题,而while循环则主要针对未知迭代对象的循环问题,语法如下:

代码语言:javascript复制
// while循环的语法
初始化计数器
  while (condition) {
    expression
    计数器叠加
    }

// do...while的语法
初始化计数器
  do {
    expression
    计数器叠加
    }
   while (condition)

举例

代码语言:javascript复制
import scala.io.StdIn
import scala.util.control.Breaks._

object WhileLoop {
    def main(args: Array[String]): Unit = {
    // 计算1...100的和
    var i = 1
    var sum = 0
    while (i <= 100) {
      sum  = i
      i  = 1
    }
    println("1...100的总和为:"   sum)

    // 用户登录邮箱,一共5次机会,如果输错则继续等待输入,并返回剩余登录次数
    breakable{
      var counts = 0
      while (true) {
        println("请输入用户名:")
        val user = StdIn.readLine()
        println("请输入密码:")
        val passwd = StdIn.readLine()

        if (user == "scala" && passwd == "123abc") {
          println("恭喜您,登录成功!")
          break()
        } else {
          if (counts < 4) {
            printf(s"输入的用户名或密码错误!您还剩${4 - counts}次输入机会!n")
          } else {
            println("输入的用户名或密码错误!,请24小时之后再尝试!")
            break()
          }
        }
        counts  = 1
      }
    }
  }
}

具有编程经验的你来说,通常在while循环中经常会用到break做强制退出,遗憾的是Scala中没有break关键词,只有break函数,该函数的目的是抛出异常,最终再由breakable函数处理。需要注意的是,break函数的调用需要导入import scala.util.control.Breaks._。

结语

本期的内容就介绍到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。

每天进步一点点:数据分析1480

长按扫码关注我

0 人点赞