• 快学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

  • 相关阅读:
    centos 7:network: 正在打开接口 ens33: 错误:激活连接失败:No suitable device found for this connection.
    python 连接 hive 的 HiveServer2 的配置坑
    node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'
    DX关联VS
    PIX
    英特尔® 图形性能分析器(Intel® GPA)
    C++之异常处理
    VS挂接崩溃包
    system 函数
    C++ Template
  • 原文地址:https://www.cnblogs.com/llguanli/p/8917259.html
Copyright © 2020-2023  润新知