案例一:对map映射模式匹配的理解,尽量使用map.get(key)
object Test1 {
def main(args: Array[String]): Unit = {
var st = "Mississippi"
println(indexs(st))
}
def indexs(txt: String) = {
//有序的
var map = mutable.Map[Char, mutable.SortedSet[Int]]()
var i = 0
/* data =>
map.get(data) match {
case Some(value) => map(data) = value + i
case None => map += (data -> mutable.SortedSet[Int] {
i
})
}
i += 1*/
txt.foreach { data =>
map.get(data) match {
case Some(value) => map(data) = value + i
case None => map += (data -> mutable.SortedSet[Int] {
i
})
}
i += 1
}
map
}
}
案例二:编写一个函数,从一个整型链表中去除所有的零值。
object Test3 {
def main(args: Array[String]): Unit = {
var list = List(1,2,3,0,3,0,1,0)
println(list.filter(_ != 0))
}
}
案例三(注意Option集合)
编写一个函数,接受一个字符串的集合,以及一个从字符串到整数值的映射。返回整型的集合,其值为能和集合中某个字符串相对应的映射的值。举例来说,给定Array(“Tom”,”Fred”,”Harry”)和Map(“Tom”->3,”Dick”->4,”Harry”->5),返回Array(3,5)。提示:用flatMap将get返回的Option值组合在一起
object Test3 {
def filterMap(arr: Array[String], map: Map[String, Int]) = {
// map.get返回Some(v), 才会被返回
arr.flatMap(map.get)
}
def main(args: Array[String]) {
println(filterMap(Array("Tom", "Fred", "Harry"),
Map("Tom" -> 3, "Dick" -> 4, "Harry" -> 5)).mkString(","))
}
}
案例四(grouped方法的使用,这是一个重要的例题,有时候打印结果是地址值)
编写一个函数。将Double数组转换成二维数组。传入列数作为参数。举例来说,Array(1,2,3,4,5,6)和三列,返回Array(Array(1,2,3),Array(4,5,6))。用grouped方法。
object Test4 {
def main(args: Array[String]): Unit = {
var array = Array[Double](1,2,3,4,5,6)
//a是一个数组,不能直接打印使用 mkstring转换
change(array, 3)foreach(a => println(a.mkString(",")))
}
def change(array: Array[Double],n:Int)={
array.grouped(n).toArray
}
}
案例五(匹配嵌套结构,这是一道难题)
abstract class Item
case class Article(description: String, price: Double) extends Iten
case class Bundle(description: String, discount: Double, item: Item*) extends Item
Bundle("Father's day special", 20.0,
Article("Scala for the Impatient", 39.95),
Bundle("Anchor Distillery Sampler", 10.0)
Article("Old potrero Straight Rye Whisky", 69.21),
Article("Junipero Gin", 79.95),
case Bundle(_, _, Article(descr, _), _*) => ...
def price(it: Item): Double = it match {
case Article(_, p) => p
case Bundle(_, disc, its @ _*) => its.map(price _).sum - disc
}
案例六(利用模式匹配,编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度至少为2)
object Test4 {
def main(args: Array[String]): Unit = {
var array = Array[Double](1,2,3,4,5,6)
array = array match {
case Array(first ,second , re @ _*) => Array(second,first) ++ re
}
println(array.mkString(","))
}