1. 程式人生 > >快學scala 第四章 讀書筆記及習題答案程式碼

快學scala 第四章 讀書筆記及習題答案程式碼

chapter 4 元組與對映

標籤:快學scala

一、筆記

  1. 預設Map為不可變對映,可變對映定義:
  1. scala> val scores = scala.collection.mutable.Map("Allic"->1,"Bob"->3,"Cindy"->8)
  2. scala> val scores =new scala.collection.mutable.HashMap[String,Int]//空對映
  3. scores: scala.collection.mutable.HashMap[String,Int]=Map()

獲取map中的值:

  1. scala>
    val bobscore = scores("Bob")
  2. bobscore:Int=3
  3. scala> val bobscore =if(scores.contains("Bob")) scores("Bob")else0//檢查操作
  4. bobscore:Int=3
  5. //簡寫
  6. scala> val bobscore = scores.getOrElse("Bob",0)
  7. bobscore:Int=3
  8. //更新操作
  9. scala> val newscore = scores +(("Bob",10),("Fred",7))
  10. newscore: scala.collection.mutable.Map[String,Int
    ]=Map(Allic->1,Bob->10,Fred->7,Cindy->8)
  1. 迭代對映 scores.keyset 關鍵字的集合; socres.value值 
    for(v <- scores.values) println(v) 
    for((k, v) <- socres) yield(v,k) //反轉對映
  2. 鍵值是鍵/值對偶的集合,對偶是元組的最簡單形式,tuple是不同型別的值的聚集。元組的各組員從1開始,而不是0. 元組可以用於函式需要返回不止一個值的情況:
  1. scala>"New York".partition(_.isUpper)
  2. res2:(String
    ,String)=(NY,ew ork)
  1. 拉鍊操作
  1. scala>"New York".partition(_.isUpper)
  2. res2:(String,String)=(NY,ew ork)
  3. scala> val symbols=Array("<","-",">")
  4. symbols:Array[String]=Array(<,-,>)
  5. scala> val counts =Array(2,10,2)
  6. counts:Array[Int]=Array(2,10,2)
  7. scala> val pairs= symbols.zip(counts)
  8. pairs:Array[(String,Int)]=Array((<,2),(-,10),(>,2))
  9. scala>for((s,n)<- pairs)Console.print(s * n)
  10. <<---------->>

二、習題答案

4.1 設定一個對映,其中包含你想要的一些裝備,以及它們的價格。然後構建另一個對映,採用同一組鍵,但是價格上打9折

  1. def equipment():Map[String,Double]={
  2. val equipmap :Map[String,Double]=Map(("eq1",10.8),("eq2",12.2),("eq3",13.3))
  3. for((n,k)<- equipmap)yield(n,k*0.9)
  4. }
  5. println(equipment().mkString(","))

4.2 編寫一段程式,從檔案中讀取單詞。用一個可變對映來清點每個單詞出現的頻率。讀取這些單詞的操作可以使用java.util.Scanner

  1. import scala.io.Source
  2. import scala.collection.mutable.HashMap
  3. val source =Source.fromFile("test.txt").mkString
  4. println(source)
  5. val tokens = source.split("\\s+")//"\\s"表示空格 回車 換行符 “+”表示多個的意思
  6. val map =newHashMap[String,Int]
  7. for(key <- tokens){
  8. map(key)= map.getOrElse(key,0)+1
  9. }
  10. println(map.mkString(","))

4.3 重複前一個練習,這次用不可變的對映

  1. import scala.io.Source
  2. val source =Source.fromFile("test.txt").mkString
  3. val tokens = source.split("\\s+")
  4. var map =Map[String,Int]()
  5. for(key <- tokens){
  6. map +=(key ->(map.getOrElse(key,0)+1))
  7. }
  8. println(map.mkString(","))

4.4 重複前一個練習,這次使用已排序的對映,以便單詞可以按順序打印出來

  1. import scala.io.Source
  2. import scala.collection.immutable.TreeMap
  3. val source =Source.fromFile("test.txt").mkString
  4. val tokens = source.split("\\s+")
  5. var map =newTreeMap[String,Int]()
  6. for(key <- tokens){
  7. map +=(key ->(map.getOrElse(key,0)+1))
  8. }
  9. println(map.mkString(",")

4.5 重複前一個練習,這次使用java.util.TreeMap並使之適用於Scala API

  1. import scala.io.Source
  2. import scala.collection.JavaConversions.mapAsScalaMap
  3. val source =Source.fromFile("test.txt").mkString
  4. val tokens = source.split("\\s+")
  5. var map =new sortedMap[String,Int]()
  6. for(key <- tokens){
  7. map +=(key ->(map.getOrElse(key,0)+1))
  8. }
  9. println(map.mkString(","))

4.6 定義一個鏈式雜湊對映,將”Monday”對映到java.util.Calendar.MONDAY,依次類推加入其他日期。展示元素是以插入的順序被訪問的

  1. import java.util.Calendar
  2. import scala.collection.mutable
  3. def calendarDays():Unit={
  4. val daysMap =mutable.LinkedHashMap(
  5. "Monday"->Calendar.MONDAY,
  6. "Tuesday"->Calendar.TUESDAY,
  7. "Wednesday"->Calendar.WEDNESDAY,
  8. "Thursday"->Calendar.THURSDAY,
  9. "Friday"->Calendar.FRIDAY,
  10. "Saturday"->Calendar.SATURDAY,
  11. "Sunday"->Calendar.SUNDAY
  12. )
  13. println(daysMap.mkString(","))
  14. }
  15. calendarDays()

4.7 打印出所有Java系統屬性的表格

  1. import scala.collection.JavaConversions.propertiesAsScalaMap
  2. def printJavaSysProps():Unit={
  3. val propMap:collection.Map[String,String]=System.getProperties()
  4. val maxKeyLength = propMap.keySet.map(_.length).max
  5. for((k,v)<- propMap ) printf("%-"+ maxKeyLength +"s | %s\n", k, v)
  6. }

4.8 編寫一個函式minmax(values:Array[Int]),返回陣列中最小值和最大值的對偶

  1. def minmax(values:Array[