4 映射和元组 

4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格。然后构建还有一个映射。採用同一组键,可是价格上打9折 
映射的简单操作 

  1. ,"gun"->18,"ipad"->1000)  
  2. , 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代码例如以下 

  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. ) + 1  
  15. }  
  16.   
  17. println(map.mkString(","))  

4.3 反复前一个练习,这次用不可变的映射 
不可变映射与可变映射的差别就是,每次加入元素,都会返回一个新的映射 

  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. ) + 1))  
  11. }  
  12.   
  13. println(map.mkString(","))  

4.4 反复前一个练习。这次使用已排序的映射。以便单词能够按顺序打印出来 
和上面的代码没有什么差别,仅仅是将映射改动为SortedMap 

  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. ) + 1))  
  12. }  
  13.   
  14. println(map.mkString(","))  

4.5 反复前一个练习。这次使用java.util.TreeMap并使之适用于Scala API 
主要涉及java与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. ) + 1  
  14. }  
  15.   
  16. println(map.mkString(","))  

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

  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的使用 

  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]),返回数组中最小值和最大值的对偶 

  1. def minmax(values:Array[Int])={  
  2.   (values.max,values.min)  
  3. }  

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

  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习题解答—第四章 映射和元组的更多相关文章

  1. 快学scala习题解答--第五章 类

    5 类  5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数 class Count{ private var value = Int.MaxValue else v ...

  2. 快学Scala习题解答—第三章 数组相关操作

    3 数组相关操作  3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间  random和yield的使用 import scala.math.rando ...

  3. 快学Scala习题解答—第一章 基础

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

  4. 快学Scala习题解答—第十章 特质

    10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...

  5. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  6. 快学Scala-第四章 映射和元组

    知识点: 1.构造映射,映射是对偶的集合 val scores1 = Map("Alice" -> 10, "Bob" -> 7, "Ci ...

  7. 《快学Scala》第四章 映射与元组

  8. 快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)

    构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, In ...

  9. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

随机推荐

  1. C语言的经典排序算法源码

    1.插入排序:插入法是一种比较直观的排序方法.它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置.把数组元素插完也就完成了排序.代码如下: #include<stdio.h> ...

  2. Android Studio 错误: 非法字符: &#39;\ufeff&#39; 解决方式|错误: 须要class, interface或enum

    在导入eclipse项目到Android Studio出现这种错误, 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum.查阅后了解到Eclipse能够智能 ...

  3. JavaScript原生对象及扩展

    来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始 ...

  4. LFU缓存

    https://leetcode-cn.com/problems/lfu-cache/description/ 缓存的实现可以采取多种策略,不同策略优点的评估就是"命中率".好的策 ...

  5. maven-compiler-plugin升级到3.1出现问题(转)

    转自:http://my.oschina.net/zhuka/blog/124503 No compiler is provided in this environment. Perhaps you ...

  6. WCF异步调用

    添加引用服务--高级--选中 生产异步操作 服务端接口操作 [OperationContract]int Add(int a, int b); 客户端: 引用服务:在引用服务时,左下角点击“高级”按钮 ...

  7. 【Oracle】详解Oracle中NLS_LANG变量的使用

    目录结构: contents structure [+] 关于NLS_LANG参数 NSL_LANG常用的值 在MS-DOS模式和Batch模式中设置NLS_LANG 注册表中NLS_LANG和系统环 ...

  8. 解决安装Egit时Egit Mylyn和org.eclipse.team.core报错

    为了让Aptana支持GitHub,需要安装Egit,但在的时候碰到两个错误,一个是关于缺少EGit Mylyn另一个是缺少org.eclipse.egit.import.feature.group. ...

  9. Swift 对象

    1.对象 对象是类的具体化的东西,从抽象整体中具体化出的特定个体. 对象是一个动态的概念. 每一个对象都存在着有别于其他对象的属于自己的独特属性和行为. 对象的属性可以随着他自己的行为的变化而改变. ...

  10. 【struts2】拦截器基础

    1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...