38 模式匹配-判断星座

25 阅读3分钟

一. 变量声明中的模式匹配

需求:现在有一个数组Array(1,2,3,4,5),希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值。

def main(args: Array[String]): Unit = {
  val arr = Array(1,2,3,4,5)

  // 定义三个变量, 分别设置初始值为arr的前三个元素的值?
  var a = arr(0)
  var b = arr(1)
  var c = arr(2)
  println(s"a = ${a} b = ${b} c = ${c}")

  // 使用模式匹配, 将arr的前三个元素分别赋值给a, b, c
  val Array(x,y,z,_*) = arr
  // _* 占位符: 表示多的部分放在这儿
  println(s"x = ${x} y = ${y} z = ${z}")
}

结果如图:

image.png

二. 守卫语句的格式

守卫语句紧跟在case模式之后,通过if关键字引入

格式如下:

value match {

    case pattern if guardCondition => result

    // 其他case语句...

}

其中,value是要进行匹配的值,pattern是匹配模式,guardCondition是守卫条件(一个布尔表达式),result是当该case分支匹配成功时返回的结果。

def main(args: Array[String]): Unit = {
  val a = 11

  a match {
    case _:Int if a > 10 => println("a是大于10的Int")
    case _ => println("a is not Int")
    
  }
}

结果如图:

image.png

三. 案例-判断星座

def getZodiac(month: Int, day: Int): String = {
  month match {
    case 1 if day >= 20 => "水瓶座" // 月份是1月,且 日期是>=20 的
    case 2 if day <= 18 => "水瓶座" // 月份是2月,且 日期是<=18 的
    case 2 if day >= 19 => "双鱼座" // 月份是2月,且 日期是>=19 的
    case 3 if day <= 20 => "双鱼座" // 月份是3月,且 日期是<=20 的
    case 3 if day >= 21 => "白羊座" // 月份是3月,且 日期是>=21 的
    case 4 if day <= 19 => "白羊座" // 月份是4月,且 日期是<=19 的
    case 4 if day >= 20 => "金牛座" // 月份是4月,且 日期是>=20 的
    case 5 if day <= 20 => "金牛座" // 月份是5月,且 日期是<=20 的
    case 5 if day >= 21 => "双子座" // 月份是5月,且 日期是>=21 的
    case 6 if day <= 21 => "双子座" // 月份是6月,且 日期是<=21 的
    case 6 if day >= 22 => "巨蟹座" // 月份是6月,且 日期是>=22 的
    case 7 if day <= 22 => "巨蟹座" // 月份是7月,且 日期是<=22 的
    case 7 if day >= 23 => "狮子座" // 月份是7月,且 日期是>=23 的
    case 8 if day <= 22 => "狮子座" // 月份是8月,且 日期是<=22 的
    case 8 if day >= 23 => "处女座" // 月份是8月,且 日期是>=23 的
    case 9 if day <= 22 => "处女座" // 月份是9月,且 日期是<=22 的
    case 9 if day >= 23 => "天秤座" // 月份是9月,且 日期是>=23 的
    case 10 if day <= 22 => "天秤座" // 月份是10月,且 日期是<=22 的
    case 10 if day >= 23 => "天蝎座" // 月份是10月,且 日期是>=23 的
    case 11 if day <= 21 => "天蝎座" // 月份是11月,且 日期是<=21 的
    case 11 if day >= 22 => "射手座" // 月份是11月,且 日期是>=22 的
    case 12 if day <= 21 => "射手座" // 月份是12月,且 日期是<=21 的
    case 12 if day >= 22 => "摩羯座" // 月份是12月,且 日期是>=22 的
    case 1 if day <= 19 => "摩羯座" // 月份是1月,且 日期是<=19 的
    case _ => "未知"
  }
}

def main(args: Array[String]): Unit = {
  println(getZodiac(2, 17)) 
  println(getZodiac(1, 21)) 
  println(getZodiac(2, 19)) 
  println(getZodiac(3, 20)) 
  println(getZodiac(12, 22))
  println(getZodiac(1, 19)) 
}

结果如图:

image.png