1. 程式人生 > 其它 >Scala 速通語法(十)| 資料結構

Scala 速通語法(十)| 資料結構

Queue

  • 佇列是一個有序列表,在底層可以用陣列或是連結串列來實現
  • 其輸入和輸出要遵循先入先出的原則。即:先存入佇列的資料,要先取出 後存入的要後取
    //建立
    val que = new mutable.Queue[Int]
    println(que)
    //追加
    que += 9//
    println(que)
    que ++= List(1,2,3) //預設加在佇列後面 按元素
    println(que)
    que.addAll(List(4,5,6))

    //出隊
    val queele = que.dequeue() //取出頭部元素
    println("ele==="+queele+"  que==="+que)
    //入隊
    que.enqueue("str")
    println("que==="+que)

    //返回佇列元素 不影響佇列
    println(que.head)
    println(que.last)
    //返回除了第一個元素的所有元素
    println(que.tail)

Map

  • HashMap 是一個散列表(陣列+連結串列),它儲存的內容是鍵值對(key-value)對映,Java 中的 HashMap是無序的,key 不能重複
  • Scala 中的 Map 和 Java 類似,也是一個散列表,它儲存的內容也是鍵值對(key-value)對映,Scala
    中不可變的 Map 是有序的,可變的 Map 是無序的
  • Scala中,有可變Map(scala.collection.mutable.Map)和不可Map(scala.collection.immutable.Map)
    //建立
    //不可變
    val map2 = immutable.Map("one" -> 1, "two" -> 2, "three" -> 3)
    println(map2)
    //可變
    val map3 = mutable.Map("one" -> 1, "two" -> 2, "three" -> 3)
    println(map3)

    //建立空對映
    val map4 = new mutable.HashMap[String,Int]
    println(map4)

    val map5 = Map(("tuple",2),("tuple2",3))
    println(map5)

    //取值
    //1) 如果 key 存在,則返回對應的值
    //2) 如果 key 不存在,則丟擲異常[java.util.NoSuchElementException]
    //3) 在 Java 中,如果 key 不存在則返回 null
    val ele = map3("two")
    println("ele = " + ele)

    //使用 containts 先判斷在取值,可以防止異常,並加入相應的處理邏輯
    if (map4.contains("Alice")) {
      println("key 存在,值=" + map4("Alice"))
    } else {
      println("key 不存在 :)")
    }

    //get取值
    println(map3.get("two"))
    println(map3.get(""))

    //getOrElse() 取值
    println(map3.getOrElse("four",4))
    
    //修改
    map3("one") = 11
    println(map3("one"))
    
    //新增
    //增加單個元素
    map3 += ("four"->4)
    map3 += ("five"->50)
    //增加多個元素
    map3 +=("six"->66,"seven"->77)

    //刪除
    map3 -=("one","two")
    //說明: "one","two"就是要刪除的key 可以寫多個
    //如果key存在,就刪除,如果key不存在,也不會報錯
  • 如何選擇取值的方式

    1. 如果我們確定 map 有這個 key ,則應當使用 map(key), 速度快
    2. 如果我們不能確定 map 是否有 key ,而且有不同的業務邏輯,使用 map.contains() 先判斷在加入邏輯
    3. 如果只是簡單的希望得到一個值,使用 map4.getOrElse("ip","127.0.0.1")
  • Map遍歷

      //新建map
      val map1 = mutable.Map(("A",1),("B","北京"),("C",3))
      
      //遍歷
          
      ```
      for((k,v)<-map1)println(k + "is mapped to" + v)
      
      for(v<-map1.keys)println(v)
      for(v<-map1.values)println(v)
    
      for(v<-map6)println(v + "key" + v._1 + "value" + v._2)//v是tuple
    

Set

  • 集是不重複元素的結合。集不保留順序,預設是以雜湊集實現
    +默 認 情 況 下 , Scala 使 用 的 是 不 可 變 集 合 , 如 果 你 想 使 用 可 變 集 合 , 需 要 引 用 scala.collection.mutable.Set
  //建立
  //不可變
  val set = Set(1,2,3)
  println(set)
  //可變
  val set2 = mutable.Set(1,2,3)
  println(set2)

  //增加
  set2.add(4)
  //刪除
  set2.remove(3)//  存在
  set2.remove(5)//  不存在 不存在,則不生效,也不會報錯
  println(set2)

  //遍歷
  for(i<-set2)println(i)