《快学Scala》习题解答----第四章 映射和元组

  1. 设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折
val map = Map("装备1"->10,"装备2"->20,"装备3"->30)
    val newMap = map.map(x => (x._1, x._2 * 0.9))
    println(newMap)
输出结果:
Map(装备1 -> 9.0, 装备2 -> 18.0, 装备3 -> 27.0)
  1. 编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用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 Scanner(new File("myfile.txt"))
    val map = mutable.Map[String,Int]()
    while (in.hasNext()){
      val strArr = in.next().split(" ")
      for(elem <- strArr){
        map(elem)= map.getOrElse(elem,0)+1
      }
    }
    in.close()
    println(map)

3 重复前一个练习,这次用不可变的映射
不可变映射每次添加元素,会返回一个新的映射

val in = new Scanner(new File("myfile.txt"))
    var map = Map[String,Int]()
    while (in.hasNext()){

      val strArr = in.next().split(" ")
      for(elem <- strArr){
        map += (elem -> (map.getOrElse(elem,0)+1))
      }
    }
    in.close()
    println(map)

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

var sortedMap = SortedMap[String,Int]()
    val in = new Scanner(new File("myfile.txt"))

    while (in.hasNext()){

      val strArr = in.next().split(" ")
      for(elem <- strArr){
        sortedMap += (elem -> (sortedMap.getOrElse(elem,0)+1))
      }
    }
    in.close()
    println(sortedMap)
  1. 重复前一个练习,这次使用java.util.TreeMap并使之适用于Scala API
    引入import scala.collection.JavaConversions.mapAsScalaMap
import scala.collection.JavaConversions.mapAsScalaMap
val treeMap:scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String, Int]
val in = new Scanner(new File("myfile.txt"))

while (in.hasNext()){

  val strArr = in.next().split(" ")
  for(elem <- strArr){
    treeMap(elem) = treeMap.getOrElse(elem,0)+1
  }
}
in.close()
println(treeMap)

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

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

7 打印出所有Java系统属性的表格
Java系统属性:System.properties
Properties类型转scala的Map类型

import scala.collection.JavaConversions.propertiesAsScalaMap
val properties:scala.collection.Map[String,String] = System.getProperties
var maxLen = -1
for(k<-properties.keySet){
  if(maxLen<k.length)
      maxLen = k.length
  }
for((k,v)<-properties){
    println(k+" "*(maxLen-k.length)+" | "+v)
}

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

def minmax(values:Array[Int]): (Int,Int) ={
  (values.reduceLeft(_.min(_)),values.reduceLeft(_.max(_)))
 }

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

def Iteqgt(values:Array[Int],v:Int)={
   (values.count(_<v),values.count(_==v),values.count(_>v))
  }

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

println("hello".zip("world"))
结果:Vector((h,w), (e,o), (l,r), (l,l), (o,d))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值