Scala--映射和元組


一、構造映射

  val scores = Map("Jim"->10, ("Tom",20), "Sam"->44) //key->value, (key,value)兩種方式表示, 不可變映射,
  val s = scala.collection.mutable.Map("Jim"->10, ("Tom",20), "Sam"->44)//可變映射
  val s1 = new scala.collection.mutable.HashMap[String, Int] //空的Map

  //scores.+=(("Lily"->10))  //不可變映射,map中不能新增元素
  s.+=(("Lily"->10))
  s1.+=(("Jim"->10))

  println(scores)
  println(s)
  println(s1)

結果:

Map(Jim -> 10, Tom -> 20, Sam -> 44)
Map(Jim -> 10, Tom -> 20, Lily -> 10, Sam -> 44)
Map(Jim -> 10)

 對偶

"A"->1

("A",1)

二、獲取映射中的值

  val scores = Map("Jim"->10, ("Tom",20), "Sam"->44)

  val score1 = scores("Lily")  //直接通過()獲取里面的值
  val score2 = if(scores.contains("Lily")) scores("Lily") else 0 //判斷是否存在,然后再取值
  val score3 = scores.getOrElse("Lily",0) //通過getOrElse方法實現,不存在給默認值

  println(score1)//沒有值,會報異常
  println(score2)
  println(score3)

 

三、更新映射中的值

可變映射

  val scores = scala.collection.mutable.Map("Jim"->10, ("Tom",20), "Sam"->44)

  scores("Jim") = 11      //更新值
  scores("Fred") = 33     //新增值

  scores += ("Lily"->30, "Li"-> 27) //增加多個
  scores.+=(("Zhao"->44))
  scores -= "Jim"      //刪除元素

  println(scores)

結果

Map(Li -> 27, Zhao -> 44, Fred -> 33, Tom -> 20, Lily -> 30, Sam -> 44)

 

不可變映射  通過聲明var變量來重新賦值,完成元素的增、刪

  var scores = Map("Jim"->10, ("Tom",20), "Sam"->44)

  scores = scores +("Lily"-> 23)
  scores -= "Jim"

  println(scores)

結果

Map(Tom -> 20, Sam -> 44, Lily -> 23)

 

四、迭代映射

  var scores = Map("Jim"->10, ("Tom",20), "Sam"->44)

  for((k, v) <- scores) println (k+","+v)
  for(i<- scores.keySet) print(i+" ")
  println()
  for(i<- scores.values) print(i+" ")

結果

Jim,10
Tom,20
Sam,44
Jim Tom Sam 
10 20 44 

 

五、已排序映射

  val sortedScores = scala.collection.immutable.SortedMap("Jim"->10, ("Tom",20), "Sam"->44)
  println(sortedScores)

結果

Map(Jim -> 10, Sam -> 44, Tom -> 20)

 

六、與Java的互操作

 

 

 

七、元組

  val tuple = (1, 3.14, "Hello")
  println(tuple._1)  //訪問第一個元組,下標值不是0而是1
  val(first, second, _) = tuple //獲取元組的元素
  println(second)

結果

1
3.14

 

八、拉鏈操作

把元組的多個值綁定在一起

  val symbols = Array("<","-",">")
  val counts = Array(2,10,2)
  val pairs = symbols.zip(counts)

  for((k,v)<- pairs) print(k * v)

結果

<<---------->>

 

keys.zip(values).toMap

通過拉鏈組合成映射 

1.

    val m = Map(("a",10),("b",18),("d",17))
    m.mapValues(_*0.9).foreach(println)

 2.

    val m = new scala.collection.mutable.HashMap[String,Int]()
    val in = new java.util.Scanner(new java.io.File("file/wordcount.txt"))
    while(in.hasNext){
      val key = in.next()
      m(key)=if (m.contains(key)) m(key)+1 else 1
    }

3.

    var word = Map[String,Int]()
    val in = new java.util.Scanner(new java.io.File("file/wordcount.txt"))
    while(in.hasNext){
      val key = in.next()
      word = word + ((key, if (word.contains(key)) word(key)+1 else 1))
    }

4.

    var sortedWords = scala.collection.immutable.SortedMap[String,Int]()
    val in = new java.util.Scanner(new java.io.File("file/wordcount.txt"))
    while(in.hasNext){
      val key = in.next()
      sortedWords = sortedWords + ((key, if (sortedWords.contains(key)) sortedWords(key)+1 else 1))
    }

5.

    import scala.collection.JavaConversions.mapAsScalaMap
    var words:scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String,Int]()
    val in = new java.util.Scanner(new java.io.File("file/wordcount.txt"))
    while(in.hasNext){
      val key = in.next()
      words(key)=if(words.contains(key)) words(key)+1 else 1
    }

6.

    val week = new mutable.LinkedHashMap[String,Int]()
    week("Monday")=java.util.Calendar.MONDAY
    week("Tuesday")=java.util.Calendar.TUESDAY
    week("Wednesday")=java.util.Calendar.WEDNESDAY

    for((k,v)<- week){
      println(k,v)
    }

7.

    import scala.collection.JavaConversions.propertiesAsScalaMap
    val props:scala.collection.Map[String,String]=System.getProperties()
    val len = props.keys.maxBy(_.length).length()
    val format = "%-"+len+"s|%s\n"
    for((k,v) <- props){
      printf(s"${format}",k,v)
    }

8. 匿名函數實現

    val minmax = (values:Array[Int])=>{ 
      (values.max,values.min)
    }

9.匿名函數實現

    val lteqgt = (values:Array[Int], v:Int)=>{
      var lt=0
      var eq=0
      var gt=0
      for(i<-values) if (i>v) gt+=1 else if(i==v) eq+=1 else lt+=1
      (lt,eq,gt)
    }

10.

Vector((H,W), (e,o), (l,r), (l,l), (o,d))

 

 

 

 

 

參考《快學Scala》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM