快學scala 第四章 讀書筆記及習題答案程式碼
阿新 • • 發佈:2019-01-22
chapter 4 元組與對映
標籤:快學scala
一、筆記
- 預設Map為不可變對映,可變對映定義:
scala> val scores = scala.collection.mutable.Map("Allic"->1,"Bob"->3,"Cindy"->8)
scala> val scores =new scala.collection.mutable.HashMap[String,Int]//空對映
scores: scala.collection.mutable.HashMap[String,Int]=Map()
獲取map中的值:
scala>
bobscore:Int=3
scala> val bobscore =if(scores.contains("Bob")) scores("Bob")else0//檢查操作
bobscore:Int=3
//簡寫
scala> val bobscore = scores.getOrElse("Bob",0)
bobscore:Int=3
//更新操作
scala> val newscore = scores +(("Bob",10),("Fred",7))
newscore: scala.collection.mutable.Map[String,Int
- 迭代對映 scores.keyset 關鍵字的集合; socres.value值
for(v <- scores.values) println(v)
for((k, v) <- socres) yield(v,k) //反轉對映 - 鍵值是鍵/值對偶的集合,對偶是元組的最簡單形式,tuple是不同型別的值的聚集。元組的各組員從1開始,而不是0. 元組可以用於函式需要返回不止一個值的情況:
scala>"New York".partition(_.isUpper)
res2:(String
- 拉鍊操作
scala>"New York".partition(_.isUpper)
res2:(String,String)=(NY,ew ork)
scala> val symbols=Array("<","-",">")
symbols:Array[String]=Array(<,-,>)
scala> val counts =Array(2,10,2)
counts:Array[Int]=Array(2,10,2)
scala> val pairs= symbols.zip(counts)
pairs:Array[(String,Int)]=Array((<,2),(-,10),(>,2))
scala>for((s,n)<- pairs)Console.print(s * n)
<<---------->>
二、習題答案
4.1 設定一個對映,其中包含你想要的一些裝備,以及它們的價格。然後構建另一個對映,採用同一組鍵,但是價格上打9折
def equipment():Map[String,Double]={
val equipmap :Map[String,Double]=Map(("eq1",10.8),("eq2",12.2),("eq3",13.3))
for((n,k)<- equipmap)yield(n,k*0.9)
}
println(equipment().mkString(","))
4.2 編寫一段程式,從檔案中讀取單詞。用一個可變對映來清點每個單詞出現的頻率。讀取這些單詞的操作可以使用java.util.Scanner
import scala.io.Source
import scala.collection.mutable.HashMap
val source =Source.fromFile("test.txt").mkString
println(source)
val tokens = source.split("\\s+")//"\\s"表示空格 回車 換行符 “+”表示多個的意思
val map =newHashMap[String,Int]
for(key <- tokens){
map(key)= map.getOrElse(key,0)+1
}
println(map.mkString(","))
4.3 重複前一個練習,這次用不可變的對映
import scala.io.Source
val source =Source.fromFile("test.txt").mkString
val tokens = source.split("\\s+")
var map =Map[String,Int]()
for(key <- tokens){
map +=(key ->(map.getOrElse(key,0)+1))
}
println(map.mkString(","))
4.4 重複前一個練習,這次使用已排序的對映,以便單詞可以按順序打印出來
import scala.io.Source
import scala.collection.immutable.TreeMap
val source =Source.fromFile("test.txt").mkString
val tokens = source.split("\\s+")
var map =newTreeMap[String,Int]()
for(key <- tokens){
map +=(key ->(map.getOrElse(key,0)+1))
}
println(map.mkString(",")
4.5 重複前一個練習,這次使用java.util.TreeMap並使之適用於Scala API
import scala.io.Source
import scala.collection.JavaConversions.mapAsScalaMap
val source =Source.fromFile("test.txt").mkString
val tokens = source.split("\\s+")
var map =new sortedMap[String,Int]()
for(key <- tokens){
map +=(key ->(map.getOrElse(key,0)+1))
}
println(map.mkString(","))
4.6 定義一個鏈式雜湊對映,將”Monday”對映到java.util.Calendar.MONDAY,依次類推加入其他日期。展示元素是以插入的順序被訪問的
import java.util.Calendar
import scala.collection.mutable
def calendarDays():Unit={
val daysMap =mutable.LinkedHashMap(
"Monday"->Calendar.MONDAY,
"Tuesday"->Calendar.TUESDAY,
"Wednesday"->Calendar.WEDNESDAY,
"Thursday"->Calendar.THURSDAY,
"Friday"->Calendar.FRIDAY,
"Saturday"->Calendar.SATURDAY,
"Sunday"->Calendar.SUNDAY
)
println(daysMap.mkString(","))
}
calendarDays()
4.7 打印出所有Java系統屬性的表格
import scala.collection.JavaConversions.propertiesAsScalaMap
def printJavaSysProps():Unit={
val propMap:collection.Map[String,String]=System.getProperties()
val maxKeyLength = propMap.keySet.map(_.length).max
for((k,v)<- propMap ) printf("%-"+ maxKeyLength +"s | %s\n", k, v)
}
4.8 編寫一個函式minmax(values:Array[Int]),返回陣列中最小值和最大值的對偶
def minmax(values:Array[