快学Scala习题解答—第四章 映射和元组

4 映射和元组  

4.1 设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折  
映射的简单操作 
Shell代码   收藏代码
  1. scala> val map = Map("book"->10,"gun"->18,"ipad"->1000)  
  2. map: scala.collection.immutable.Map[java.lang.String,Int] = Map(book -> 10, gun -> 18, ipad -> 1000)  
  3.   
  4. scala> for((k,v) <- map) yield (k,v * 0.9)  
  5. res3: scala.collection.immutable.Map[java.lang.String,Double] = Map(book -> 9.0, gun -> 16.2, ipad -> 900.0)  


4.2 编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用java.util.Scanner: 
val in = new java.util.Scanner(new java.io.File("myfile.txt")) while(in.hasNext()) 处理 in.next() 或者翻到第9章看看更Scala的做法。 最后,打印出所有单词和它们出现的次数。
 
当然使用Scala的方法啦。参考第9章 
首先,创建一个文件myfile.txt。输入如下内容 
test test ttt test ttt t test sss s 
Scala代码如下 
Scala代码   收藏代码
  1. import scala.io.Source  
  2. import scala.collection.mutable.HashMap  
  3.   
  4. //val source = Source.fromFile("myfile.txt")  
  5. //val tokens = source.mkString.split("\\s+")  //此写法tokens为空,不知为何  
  6.   
  7. val source = Source.fromFile("myfile.txt").mkString  
  8.   
  9. val tokens = source.split("\\s+")  
  10.   
  11. val map = new HashMap[String,Int]  
  12.   
  13. for(key <- tokens){  
  14.     map(key) = map.getOrElse(key,0) + 1  
  15. }  
  16.   
  17. println(map.mkString(","))  


4.3 重复前一个练习,这次用不可变的映射 
不可变映射与可变映射的区别就是,每次添加元素,都会返回一个新的映射
 
Scala代码   收藏代码
  1. import scala.io.Source  
  2.   
  3. val source = Source.fromFile("myfile.txt").mkString  
  4.   
  5. val tokens = source.split("\\s+")  
  6.   
  7. var map = Map[String,Int]()  
  8.   
  9. for(key <- tokens){  
  10.   map += (key -> (map.getOrElse(key,0) + 1))  
  11. }  
  12.   
  13. println(map.mkString(","))  


4.4 重复前一个练习,这次使用已排序的映射,以便单词可以按顺序打印出来 
和上面的代码没有什么区别,只是将映射修改为SortedMap
 
Scala代码   收藏代码
  1. import scala.io.Source  
  2. import scala.collection.SortedMap  
  3.   
  4. val source = Source.fromFile("myfile.txt").mkString  
  5.   
  6. val tokens = source.split("\\s+")  
  7.   
  8. var map = SortedMap[String,Int]()  
  9.   
  10. for(key <- tokens){  
  11.   map += (key -> (map.getOrElse(key,0) + 1))  
  12. }  
  13.   
  14. println(map.mkString(","))  


4.5 重复前一个练习,这次使用java.util.TreeMap并使之适用于Scala API  
主要涉及java与scala的转换类的使用 
Scala代码   收藏代码
  1. import scala.io.Source  
  2. import scala.collection.mutable.Map  
  3. import scala.collection.JavaConversions.mapAsScalaMap  
  4. import java.util.TreeMap  
  5.   
  6. val source = Source.fromFile("myfile.txt").mkString  
  7.   
  8. val tokens = source.split("\\s+")  
  9.   
  10. val map:Map[String,Int] = new TreeMap[String,Int]  
  11.   
  12. for(key <- tokens){  
  13.   map(key) = map.getOrElse(key,0) + 1  
  14. }  
  15.   
  16. println(map.mkString(","))  


4.6 定义一个链式哈希映射,将"Monday"映射到java.util.Calendar.MONDAY,依次类推加入其他日期。展示元素是以插入的顺序被访问的  
LinkedHashMap的使用 
Scala代码   收藏代码
  1. import scala.collection.mutable.LinkedHashMap  
  2. import java.util.Calendar  
  3.   
  4. val map = new LinkedHashMap[String,Int]  
  5.   
  6. map += ("Monday"->Calendar.MONDAY)  
  7. map += ("Tuesday"->Calendar.TUESDAY)  
  8. map += ("Wednesday"->Calendar.WEDNESDAY)  
  9. map += ("Thursday"->Calendar.THURSDAY)  
  10. map += ("Friday"->Calendar.FRIDAY)  
  11. map += ("Saturday"->Calendar.SATURDAY)  
  12. map += ("Sunday"->Calendar.SUNDAY)  
  13.   
  14.   
  15. println(map.mkString(","))  


4.7 打印出所有Java系统属性的表格  
属性转scala map的使用 
Scala代码   收藏代码
  1. import scala.collection.JavaConversions.propertiesAsScalaMap  
  2.   
  3. val props:scala.collection.Map[String,String] = System.getProperties()  
  4.   
  5. val keys = props.keySet  
  6.   
  7. val keyLengths = for( key <- keys ) yield key.length  
  8.   
  9. val maxKeyLength = keyLengths.max  
  10.   
  11. for(key <- keys) {  
  12.   print(key)  
  13.   print(" " * (maxKeyLength - key.length))  
  14.   print(" | ")  
  15.   println(props(key))  
  16. }  


4.8 编写一个函数minmax(values:Array[Int]),返回数组中最小值和最大值的对偶  
Scala代码   收藏代码
  1. def minmax(values:Array[Int])={  
  2.   (values.max,values.min)  
  3. }  


4.9 编写一个函数Iteqgt(values:Array[int],v:Int),返回数组中小于v,等于v和大于v的数量,要求三个值一起返回  
Scala代码   收藏代码
  1. def iteqgt(values:Array[Int],v:Int)={  
  2.   val buf = values.toBuffer  
  3.   (values.count(_ < v),values.count(_ == v),values.count(_ > v))  
  4. }  


4.10 当你将两个字符串拉链在一起,比如"Hello".zip("World"),会是什么结果?想出一个讲得通的用例  
scala> "Hello".zip("World") 
res0: scala.collection.immutable.IndexedSeq[(Char, Char)] = Vector((H,W), (e,o), (l,r), (l,l), (o,d))  
StringOps中的zip定义如下 
abstract def zip (that: GenIterable[B]): StringOps[(A, B)] 

GenIterable是可遍历对象需要包含的trait,对于String来说,它是可遍历的。但是它的遍历是遍历单个字母。 所以拉链就针对每个字母来进行。

原博客地址:http://www.ivanpig.com/blog/?p=464

你可能感兴趣的:(scala学习笔记)