运算符、流程控制

运算符

var a:Int=10/3  //a=3
var b:Double=10/3  //b=3.0
//这里是10/3结果为int类型,然后转换为double类型,所以是3.0而不是3.3333333333333335
var c:Double=10.0/3  //c=3.3333333333333335
var c=10.0/3  //c=3.3333333333333335

怎样格式化输出c?

println(c.formatted("%.2f")) //3.33
//.2f表示四舍五入保留两位小数

比较运算符和java一致。
比较运算符

在java中:当字符串s1和s2内容相同但地址不同时,用“==”比较符则为false。有专门的判断字符串内容是否相同的方法。s1.equals(s2),若s1与s2内容相同则返回true,反之false。

String s1="hi";
String s2=new String("hi");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true

而在Scala中判断的直接是s1与s2的内容是否相同,所以==和equals结果相同。

println(s1==s2)//true
println(s1.equals(s2))//true

那么在Scala中如何判断字符串地址是否相同?

println(s1.eq(s2))//false

逻辑运算符
基本和java一致。
判断一个字符串是否为空

def isNotEmpty(str:String):Boolean={
  return str!=null && !("".equals(str.trim))
}

赋值运算符
基本和java一致。但java中有自增“++”和自减“–”,而Scala没有。
在这里插入图片描述
在Java中

byte b=10;
b=b+1; //报错,b+1会自动转型(低精度转高精度)为int类型
//而int类型不能自动转型为byte类型,此处要强转
b=(byte)(b+1);
//或者可以用+=
b+=1; //这里会自动强转

在Scala中

var b:Byte=10
b+=1 //报错,Scala中不能这样做
var i:Int=10
i+=1  //可以

流程控制

条件语句
if…else 语法和java一致
不同之处:在Scala中,if和else if语句是有返回值的

object Student{
  def main(args: Array[String]): Unit = {
    var age:Int=StdIn.readInt();//输入3
    //这里返回值类型为Unit,说明无返回值,所以输出为空括号
    val m:Unit=if(age<=5){
      println("w")
    }else{
      println("d")
    }
    println(m);//输出的为一个空括号()
  }
}

若想要m中有内容,需要在if和else if语句后面添加对应的返回值

object Student{
  def main(args: Array[String]): Unit = {
    var age:Int=StdIn.readInt();
    val m:String=if(age<=5){
      println("w")
      "www"
    }else{
      println("d")
      "ddd"
    }
    println(m);
  }
}

在这里插入图片描述
如果m的返回值既想要有string又想有int,则设置返回值类型为int和string的公共父类any

object Student{
  def main(args: Array[String]): Unit = {
    var age:Int=StdIn.readInt();
    val m:Any=if(age<=5){
      println("w")
      "www"
    }else{
      println("d")
      age
    }
    println(m);
  }
}

scala中if…else更简洁的写法:

val a=if(age>=18) "成年" else "未成年"

For循环

for(i<- 1 to 10){//表示i从1-10
	print(i+" ")
}

如果不想包含后边界,有两种写法

//Range()
for(i<- Range(1,10)){
	print(i+" ")//i从1-9
}
//until
for(i<- 1 until 10){
	print(i+" ")//i从1-9
}

集合遍历
Scala中集合遍历不需要用索引,很方便

for(i<- Array(12,34,56,99)){
      println(i)
}
for(i<- List(12,34,56,99)){
      println(i)
}
for(i<- Set(12,34,56,99)){
      println(i)
}

循环守卫

//表示当i!=2时才循环
for(i<- 1 to 4 if i!=2){
	print(i+" ")//输出1 3 4 
}
//等同于
for(i<- 1 to 4){
	if(i!=2){
		//循环内容
    }
}

循环步长
循环时默认步长为1,相当于java中的 i ++,但可以人为设置,选择跳着取循环变量 i 的值,例如 i 为1-10范围内的偶数
则 i 的取值为 2 4 6 8 10 这里就相当于 i 每次加2

for(i<- 2 to 10 by 2){
	print(i+" ") //2 4 6 8 10
}

当循环变量范围设置为从小到大,但步长设置为负数时,循环不会输出内容,因为表示步数后退

//不进行循环,因为步数为负而i表示1-10
for(i<- 1 to 10 by -2){
}

//可以循环,步数为负,但i表示10-1
for(i<- 10 to 1 by -2){
	print(i+" ")//10 8 6 4 2
}

想要倒着输出,还可以:

//这里要记得导包,否则报错
import scala.language.postfixOps

for(i<- 1 to 10 reverse){
	print(i+" ")//10 9 8 ...
}
//注意不能写成,循环不会进行
for(i<- 10 to 1 reverse){
}

当然,步长也可以是double类型,不过 i 的类型也要是double类型。但这样可能会导致数据丢失,比如当步长为0.3时,因为不能整除的原因导致部分数据舍去

for(i<- 1.0 to 10.0 by 0.5){
	print(i+" ")
}

嵌套循环

//基础写法 显然是一个10*10矩阵
for(i<- 1 to 10){
	for(j<- 1 to 10){
		print(i+" "+j)
	}
}

//改进写法
for(i<-1 to 10; j<- 1 to 10){
}

打印一个九九乘法表

object Student{
  def main(args: Array[String]): Unit = {
    for(i<- 1 to 9){
      for(j<- 1 to i){
        print(s"$j*$i=${i*j} \t")
      }
      println()
    }
  }
}

//简写
for(i<- 1 to 9;j<- 1 to i){
	print(s"$j*$i=S{i*j} \t")
	if(j==i) println()
}

引入变量
写起来有点像前面的双重for循环,但是含义不一样。这里的 j 是直接赋值操作,并非代表另一层循环的循环变量。
在这里插入图片描述
应用场景

//每个j都有个i与之对应
for(i<- 1 to 10){
	val j=10-i
	print(i+" "+j)
}

//可以改写为,这样更加简洁
for(i<- 1 to 10;j=10-i){
	print(i+" "+j)
}
//还可以这样写
//用花括号代替圆弧括号,分两行写,可以不用写分号
for{
	i<- 1 to 10
	j=10-i
}
{
	print(i+" "+j)
}

输出九层妖塔

for(i<- 1 to 18 by 2;j=(18-i)/2){
	println(" "*j+"*"*i+" "*j)
}

while循环
while和do…while循环用法和java中一样,但不推荐使用while

循环中断
在这里插入图片描述

//使用抛出异常终止循环
object Student{
  def main(args: Array[String]): Unit = {
    try{
      for(i<- 0 until 5){
        if(i==3)
          throw new RuntimeException
        println(i)
      }
    }catch {
      case e:Exception=> //什么都不做,只是退出循环
    }
    println("这是循环语句")
  }
}

//简化代码
//使用Scala中Breaks类的break方法,实现异常的抛出和捕捉
//要引入包
import scala.util.control.Breaks._

object Student{
  def main(args: Array[String]): Unit = {
    breakable(
      for (i<- 0 until 5){
        if(i==3)
          break()
        println(i)
      }
    )
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值