模式匹配-基础使用

35 阅读3分钟
package matchcase

/**1.编写一个函数,输入省份编号。返回省份名称
 * 42  湖北
 * 11  北京
 *
 * * match case的用法
 * * (1)类似于if else if 这种多分支选择结构,精确匹配值
 * * 1.case _ 是不可省略的,如果匹配不成功,又没有case_,程序会报错
 * * 2.如果case _ 必需要放最后
 */
object matchcase01 {
  def main(args: Array[String]): Unit = {
    println(getProvinceName(11))
    println(getProvinceName(42))
    println(getProvinceName(12))

  }
  def getProvinceName(code : Int):String={
    code match{
      case 42 => "湖北"
      case 11 => "北京"
      case _ => ""
    }
  }
}

image.png

package matchcase

/**
 * 1.编写一个函数,传入一个元组,其中元素个数并不相同
 * match case的用法
 * (1)类似于if else if 这种多分支选择结构,精确匹配值
 * 1.case _ 是不可省略的,如果匹配不成功,又没有case_,程序会报错
 * 2.如果case _ 必需要放前面
 *
 *
 *
 */
object matchcase02 {
  def main(args: Array[String]): Unit = {
    val xiaohong = (100, 100, 100)
    val xiaoming = (89, 98)
    getScore(xiaohong)
    getScore(xiaoming)
    getScore((1, 2, 3, 4))
  }

  def getScore(score: Any): Unit = {
    score match {
      case (a, b, c) => println(s"元组中有三个元素:a =" + a + " b=" + b + " c=" + c)
      case (a, b) => println(s"元组中有两个元素:a=" + a + " b=" + b)
      case _ => println("未知")

    }
  }
}

image.png

package matchcase

/**
 * (3)匹配变量类型
 * (3)匹配元素特征
 */
object matchcase03 {
  def main(args: Array[String]): Unit = {
    tasType(Array(1,2,3))
    tasType((1,2,3,4))
    tasType((11,2,3,4))
    tasType((11,1,3,4))
  }

  def tasType(i: Any): Unit = {
    i match {
      case Array(1,x,y) => println("arr是一个数组,有三个元素,第一个是1")
      case Array(1,x,y,z) => println("arr是一个数组,有四个元素,第一个是1")
      case Array(x,1,y,z)  => println("arr是一个数组,有四个元素,第二个是1")
      case _ => println("未知")
    }
  }
}

image.png

package matchcase

/**
 * (3)匹配元素特征
 * (4)匹配元素特征
  * (5)样例类及其属性
 */
object matchcase04 {
  //定义一个样例类:圆形.它有一个属性
  case class Circle(radius:Double)
 //定义一个样例类:矩形.:长和宽
  case class Rectangle(width:Double,height:Double)
//定义一个方法,用来求圆形,矩形的面积
  def getArea(obj:Any):Unit= {
    obj match {
      case Circle(radius) => println("圆的面积是:"+radius *radius * 3.14)
      case Rectangle(width, height) => println("矩形的面积是:"+ width * height)
      case _ => println("未知")
    }
  }
  def main(args: Array[String]): Unit = {
    getArea(Circle(2))
    getArea(Rectangle(2,3))
    getArea("abc")
  }
}

image.png

package matchcase

/**
 * (3)匹配元素特征
 * (4)匹配元素特征
  * (5)样例类及其属性
 * (6)变量声明中的匹配模式
 */
object matchcase05 {
  def main(args: Array[String]): Unit = {
    var arr = Array(1,2,3,4)
    //定义三个变量,分别设置初始值为arr的前三个元素的☞
    var a = Array(0)
    var b = Array(0)
    var c = Array(0)
    println("a = "+ a+" b = "+b+" c = "+c)
    //使用模式匹配,将arr的第三个元素分别赋值给a,b,c
    val Array (x,y,z,_*) = arr
    //_*占位符,表示多的部分放在这儿
    println("x = "+x+" y = "+y+" z = "+z)
  }

image.png

package matchcase

/**
 *写一个函数,参数有连个。一个是月份,一个是日期。返回值是对应的星座
 * 1月20日-2月18日 水瓶座
 *
 */
object matchcase07 {
  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 => "双鱼座"
    case 3  if day <= 20 => "双鱼座"
    case 3  if day >= 21 => "白羊座"
    case 4  if day <= 19 => "白羊座"
    case 4  if day >= 20 => "金牛座"
    case 5  if day <= 20 => "金牛座"
    case 5  if day >= 21 => "双子座"
    case 6  if day <= 21 => "双子座"
    case 6  if day >= 22 => "巨蟹座"
    case 7  if day <= 22 => "巨蟹座"
    case 7  if day >= 23 => "狮子座"
    case 8  if day <= 22 => "狮子座"
    case 8  if day >= 23 => "处女座"
    case 9  if day <= 22 => "处女座"
    case 9  if day >= 23 => "天秤座"
    case 10 if day <= 22 => "天秤座"
    case 10 if day >= 23 => "天蝎座"
    case 11 if day <= 21 => "天蝎座"
    case 11 if day >= 22 => "射手座"
    case 12 if day <= 21 => "射手座"
    case 12 if day >= 22 => "摩羯座"
    case _ => "未知"
  }
  def main(args: Array[String]): Unit = {
   println(getZodiac(1, 19))
   println(getZodiac(1, 21))
  }
}