2019年9月5日 星期四

Scala 2.x 四 集合

※List、Set、Map 宣告

println(List(1, 1, 2, 2, null))
println(Set(1, 1, 2, 2, null))
println(Map("a" -> 1, "b" -> null)) // key 不能 null,value 可以;但如果有宣告泛型都不能是 null

限定某個類型,類似 java 的泛型
val value:List[Int] = List(1, 1, 2, 2, null)
以上都是不可變的,預設都是 scala.collection.immutable,可變的在 scala.collection.mutable
Set 和 Map都有同名的類別,但 List 的可變類別是 ListBuffer


※List

var xxx = 1 :: (2 :: (3 :: Nil)) // List(1,2,3),最後一定要寫 Nil
xxx.foreach(n => println(n))
println(xxx.head) // 1
println(xxx.tail) // List(2, 3), 返回第一個以外的元素
println(xxx.isEmpty) // false


var xxx = List(1, 2, 3)
var ooo = List(4, 5, 6)
var zzz = xxx.concat(ooo) // xxx ::: ooo
zzz.foreach(n => println(n)) // 1-6

※::: 等同於 concat

※可變的 List

import scala.collection.mutable.ListBuffer

val listBuffer = ListBuffer(1,2,3)
listBuffer += 4 // unit.addOne(4)
println(listBuffer)


※Set

import scala.collection.mutable.Set
val mutableSet:Set[String] = Set("a", "b", "c")
println(mutableSet.getClass.getName) // scala.collection.mutable.HashSet


mutableSet.add("d") // a b c d
mutableSet.remove("b") // a c d
mutableSet += "e" // a c d e
mutableSet -= "a" // c d e

※這裡用的是可變的


※整合兩個集合 (List、Set 、Map 混合都可以)

val s1 = Set("a", "b", "c")
val s2 = Set("d", "e")
val s3= s1 ++ s2
println(s3)


※最大值、最小值

val n = Set(78,44,88,115)
println(n.min)
println(n.max)



※Map

import scala.collection.mutable.Map


val map: Map[String, Int] = Map("a" -> 1, "b" -> 2)
map += ("c" -> 88)
map.keys.foreach(k => println(k + "-" + map(k)))


※整合兩個集合(List、Set、Map 混合都可以)

val map1: Map[String, Int] = Map("a" -> 1, "b" -> 2)
val map2: Map[String, Int] = Map("c" -> 3, "d" -> 4)
val map3 = map1 ++ map2
println(map3)



※Tuple

裡面可以放入不同類型,可以重複,但都是不可變的,可以回傳多個值 (1~22)
也就是 List,但值可以是多種型態

val t = ("x", true, 3): Tuple3[String, Boolean, Int]
println(t._1) // x
println(t._2) // true
println(t._3) // 3


// 解構賦值
val (s, b, i) = t
println(s) // x
println(b)// true
println(i) // 3

※scala 內鍵從 Tuple1~Tuple22,數字表示參數數量


// 匹配

val list = List(("a", 1), ("b", 2), ("c", 3), ("d", 4))
list.foreach(t => {
  t match {
case ("a", v) => println("a=" + v)
case (k, 2) => println(k + "=2")
// case k if k._1 == "c" => println(s"${k._1}=${k._2}")
case k => if(k._1 == "c") println(s"${k._1}=${k._2}")
case _ => println(".............")
  }
})

※如果匹配到多個會以第一個為主

※不用也不可寫 break 和 continue,只會判斷一個,但下面有個例外

※=> 前面還可以寫 if,再做一次判斷,圓括號可省略

※如果 if 寫在 => 前面,當沒有匹配到時,會再去 _ 的判斷式裡,如果沒有寫 _ 判斷式,會報 scala.MatchError;但 if 寫在 => 後面,沒判斷到就 continue 了

// for 迴圈

val list = List(("a", 1), ("b", 2), ("c", 3), ("d", 4))
for ((x, y) <- list) {
  println(x + y) // a1 b2 c3 d4
}

沒有留言:

張貼留言