//快學scala的第四章課後習題第一題
val prices=Map("xiaomi"->5,"meizu"->10,"huawei"->20)
//
短短一行代碼就可以把價格打九折返回給一個新的map
val disprice=for((k,v)<-prices) yield (k,v*0.9)
for((k,v)<-disprice)
{
println(k+" : "+v)
}
//快學scala的第四章課後習題第二題
val in=
new java.util.Scanner(
new File(
"C:\\Users\\user\\Desktop\\快學Scala 課後習題答案集合\\a.txt"));
val wordcount: Map[String, Int] =new mutable.HashMap[String,Int]();
while(in.hasNext){
var temp=in.next()
//scala 方便的方法讓wordcount短短几行代碼。
// getOrElse(key,default)獲取key對應的value,如果不存在則返回一個默認值。(這個問題也可以使用Option類解決,見下文)
wordcount.put(temp,wordcount.getOrElse(temp,0)+1)
}
//判斷wordcount裏面是否有key爲“aaa”的元素,沒有的話則添加(“aaa”,20)到wordcount中
wordcount.getOrElseUpdate("aaa",20)
//遍歷輸出map
for((k,v)<-wordcount)
{
println(k+" : "+v)
}
// map.get返回值是Option[T],這一切都需要從Option說起:
//標準庫中的Option類型用樣例來表示:“那種可能存在,也可能不存在的值”。樣例子類Some包裝了某個值,例如:Some("Tom")
//,而樣例None表示沒有值
//例如:map.get返回值是Option[T]
// 如果map中有key爲iPhone記錄的話則wordcount.get("iPhone")有值,否則wordcount.get("iPhone")爲None
//爲了避免使用None所以引進這個Option類
1:使用match模式匹配:
wordcount.get("iPhone") match {
case Some(v)=> println(v)
case None =>println("No Value")
}
2:使用isEmpty和get解決
// get可以獲取處Option中的值。
val num=wordcount.get("hadoop")
if (num.isEmpty) println("No Value") else println(num.get)
如果是map可以使用getOrElse方法 而不必使用上面1,2方法。
同時可以把Option當做是一個要麼爲空,要麼有帶有單個元素的集合,並使用諸如
map,foreach或filter等方法。例如:
wordcount.get("hadoop").foreach(println _)
如果有hadoop則get詞頻次數並打印,否則get返回None,什麼也不做。