《快学Scala》习题详解 第4章 映射和元组

1 设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折

   //默认不可变映射
    val map = Map("Zeus" -> 10, "KKK" -> 3, "King" -> 0)
    val map2 = for ((k, v) <- map) yield (k, v * 0.9)
    for ((k, v) <- map2) println(k + ":" + v)

2 编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用java.util.Scanner:
val in = new java.util.Scanner(new java.io.File(“myfile.txt”)) while(in.hasNext()) 处理 in.next() 或者翻到第9章看看更Scala的做法。 最后,打印出所有单词和它们出现的次数。

    val in = new java.util.Scanner(new java.io.File("c:/my.ini"))
    val map = new scala.collection.mutable.HashMap[String, Int]
    while (in.hasNext()) {
      var word = in.next()
      map += (word -> (map.getOrElse(word, 0) + 1))
    }
    for ((k, v) <- map) println(k + ":" + v)

3 重复前一个练习,这次用不可变的映射

    val in = new java.util.Scanner(new java.io.File("c:/my.ini"))
    var map = Map[String, Int]()
    while (in.hasNext()) {
      var word = in.next()
      map += (word -> (map.getOrElse(word, 0) + 1))
    }
    for ((k, v) <- map) println(k + ":" + v)

4 重复前一个练习,这次使用已排序的映射,以便单词可以按顺序打印出来

    val in = new java.util.Scanner(new java.io.File("c:/my.ini"))
    //SortedMap为伴生对象的,不能使用new
    var map = scala.collection.SortedMap[String, Int]()
    while (in.hasNext()) {
      var word = in.next()
      map += (word -> (map.getOrElse(word, 0) + 1))
    }
    for ((k, v) <- map) println(k + ":" + v)

5 重复前一个练习,这次使用java.util.TreeMap并使之适用于Scala API
记得导包

import scala.collection.JavaConversions.mapAsScalaMap
object get {
  def main(args: Array[String]): Unit = {
    val in = new java.util.Scanner(new java.io.File("c:/my.ini"))
    //SortedMap为伴生对象的,不能使用new
    val map: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]
    while (in.hasNext()) {
      var word = in.next()
      map.put(word, map.getOrElse(word, 0) + 1)
    }
    for ((k, v) <- map) println(k + ":" + v)
  }
}

6 定义一个链式哈希映射,将”Monday”映射到java.util.Calendar.MONDAY,依次类推加入其他日期。展示元素是以插入的顺序被访问的

   val calendar = scala.collection.mutable.LinkedHashMap[String, Int]()
    calendar += ("Monday" -> java.util.Calendar.MONDAY)
    calendar += ("Tuesday" -> java.util.Calendar.TUESDAY)
    calendar += ("Wednesday" -> java.util.Calendar.WEDNESDAY)
    calendar += ("Thursday" -> java.util.Calendar.THURSDAY)
    calendar += ("Friday" -> java.util.Calendar.FRIDAY)
    calendar += ("Saturday" -> java.util.Calendar.SATURDAY)
    calendar += ("Sunday" -> java.util.Calendar.SUNDAY)
    println(calendar)

7 打印出所有Java系统属性的表格

    val map = System.getProperties
    val key = for (k <- map) yield (k + "").length()
    //找出最长的
    val max = key.max
    // 对字符串使用“ ”补齐
    def f(s: String) = {
      " " * (max - s.length())
    }
    for ((k, v) <- map) println(k + f(k + "") + "|" + v)

8 编写一个函数minmax(values:Array[Int]),返回数组中最小值和最大值的对偶

   val arr = Array(1, 2, 3, 5, 5, 6)
    def minmax(arr: Array[Int]) = {
      (arr.min, arr.max)//通过()定义元组,对偶是最简单的元组,元组最短为2
    }
    println(minmax(arr).getClass)

9 编写一个函数Iteqgt(values:Array[int],v:Int),返回数组中小于v,等于v和大于v的数量,要求三个值一起返回
使用Array的count()方法

    val arr = Array(1, 2, 3, 5, 5, 6)
    def f(values: Array[Int], v: Int) ={
      (values.count { _ < v }, values.count { _ == v }, values.count { _ < v })
    }
    println(f(arr, 3))

10 当你将两个字符串拉链在一起,比如”Hello”.zip(“World”),会是什么结果?想出一个讲得通的用例

scala> "Hello".zip("World")
res1: scala.collection.immutable.IndexedSeq[(Char, Char)] = Vector((H,W), (e,o),
 (l,r), (l,l), (o,d))

调用StringOps:def zip[B](that: GenIterable[B]): String[(A, B)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值