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)]