模式匹配

35 阅读2分钟

精准匹配值

package matchcase

/**
 * 任务:
 * 1 填写一个函数,输入省份编号,返回省份名称
 *  42 湖北
 *  11 北京
 */
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 _ => "未知"
        }
      }
}

匹配元组元素的数量

package matchcase

/**
 * 任务:
 * 1  填写一个函数,传入一个元组,其中元素个数各不相同
 *
 *
 */
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) = {
    score match {
      case (a, b, c) => println("元组中有三个元素:a = " + a + "b = " + b + "c = " + c)
      case (a, b) => println("元组中有两个元素:a = " + a + "b = " + b)
      case _ => println("未知")
    }
  }
}

匹配变量类型

package matchcase
/**
 *  * 任务:
 *  * 1  填写一个函数,传入一个元组,其中元素个数各不相同
 *
  *
  */
 object matchcase03 {
   def main(args: Array[String]): Unit = {
    testType(1)
    testType(1.1)
    testType("1")
  }

  def testType(i: Any) = {
    i match {
      case x: Int => println("当前变量是: Int")
      case x: Double => println("当前变量是: Double")
      case _ => println("未知")
    }
  }
}

匹配元素特征

package matchcase

/**
 * 任务:
 * 1  填写一个函数,传入一个元组,其中元素个数各不相同
 *
 *
 */
object matchcase04 {
  def main(args: Array[String]): Unit = {
    testType(Array(1,2,3))
    testType(Array(1,2,3,4))
    testType(Array(11,2,3,4))
    testType(Array(11,1,3,4))
  }

  def testType(arr:Any):Unit = {
    arr 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("未知")
    }
  }
}

样例类及其属性

package matchcase

/**
 * 任务:
 * 1  填写一个函数,传入一个元组,其中元素个数各不相同
 *
 *
 */
object matchcase05 {
  // 定义一个样例类:圆形。它有一个属性:半径
  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))  // 原代码是circle(2),这里修正为大写C
    getArea(Rectangle(2,3))
    getArea("abc")
  }
}
package matchcase

/**
 * 任务:
 * 1  填写一个函数,传入一个元组,其中元素个数各不相同
 *
 *
 */
object matchcase06 {
  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("a = " + a + " b = " + b + " c = " + c)

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