//快学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,什么也不做。