Scala教學(六)集合

今天要跟大家介紹的是在寫程式很常使用的 集合 。常用的包含 ListsSetsMaps

Quick Start

接下來將要分享我的Scala學習筆記,有任何建議與需要改進的地方,也請大家多多指教。

參考書籍Learning Scala

Lists

直接看範例怎麼使用的:

1
2
3
4
5
scala> val colors = List("red", "green", "blue")
colors: List[String] = List(red, green, blue)

scala> println(s"I have ${colors.size} colors: $colors")
I have 3 colors: List(red, green, blue)

Scala 中,提供了很多方便的方法。
如:

1
2
3
4
5
6
7
8
scala> colors.head
res1: String = red

scala> colors.tail
res2: List[String] = List(green, blue)

scala> colors(2)
res3: String = blue

另外,如果將 list 結合 for-loops 呢?這邊使用到我們Scala教學(三)表達式與條件語句教的

1
2
3
4
scala> for (c <- colors) { println(c) }
red
green
blue

结合Scala教學(五)進階函式所學

  • 使用 foreach 時,無返回值

    1
    2
    3
    4
    5
    6
    7
    scala> val colors = List("red", "green", "blue")
    colors: List[String] = List(red, green, blue)

    scala> colors.foreach( (c: String) => println(c) )
    red
    green
    blue
  • 使用 map 時,可以有返回值

    1
    2
    scala> val sizes = colors.map( (c: String) => c.size )
    sizes: List[Int] = List(3, 5, 4)
  • 使用 reduce ,可將兩個值合成一個值

    1
    2
    3
    4
    5
    scala> val numbers = List(32, 95, 24, 21, 17)
    numbers: List[Int] = List(32, 95, 24, 21, 17)

    scala> val total = numbers.reduce( (a: Int, b: Int) => a + b )
    total: Int = 189

Set

Set 這類型的集合,儲存的值會濾掉重複的
如:

1
2
scala> val unique = Set(10, 20, 30, 20, 20, 10)
unique: scala.collection.immutable.Set[Int] = Set(10, 20, 30)

使用 :: 建構 List

除了傳統的 List(...) 這種寫法外,還可以使用 Nil:: 結合的方式進行 List 的宣告
如:

1
2
scala> val numbers = 1 :: 2 :: 3 :: Nil
numbers: List[Int] = List(1, 2, 3)

List 提供的 function

Name Example Description
:: 1::2::Nil 將所有元素串接成list
::: List(1, 2) ::: List(2, 3) 將兩個list進行串接
++ List(1, 2) ++ Set(3, 4, 3) 將集合中的元素串接至list
== List(1, 2) == List(1, 2) 判斷兩個list是否相等
distinct List(3, 5, 4, 3, 4).distinct 過濾list中重複的元素
drop List(‘a’, ‘b’, ‘c’, ‘d’) drop 2 擷取第n個元素
filter List(23, 8, 14, 21) filter (_ > 18) 將符合條件的元素返回保留
flatten List(List(1, 2), List(3, 4)).flatten 將lists轉換成一個list
partition List(1, 2, 3, 4, 5) partition (_ < 3) 將一個list透過判斷式分成兩個list
reverse List(1, 2, 3).reverse 將list中的元素進行反轉
slice List(2, 3, 5, 7) slice (1, 3) 包含第一個index不包含第二個index
sortBy List(“apple”, “to”) sortBy (_.size) 透過回傳的值進行排序
sorted List(“apple”, “to”).sorted 使用scala內部機制進行排序
splitAt List(2, 3, 5, 7) splitAt 2 將第n個元素開始進行拆分
take List(2, 3, 5, 7, 11, 13) take 3 從0開始取,不包含n
zip List(1, 2) zip List(“a”, “b”) 將兩個list進行結合

我們來看幾個 Example 的結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
scala> val numbers = 1 :: 2 :: 3 :: Nil
numbers: List[Int] = List(1, 2, 3)

scala> List(1, 2) ::: List(2, 3)
res6: List[Int] = List(1, 2, 2, 3)

scala> List(1, 2) ++ Set(3, 4, 3)
res7: List[Int] = List(1, 2, 3, 4)

scala> List(1, 2) == List(1, 2)
res8: Boolean = true

scala> List(3, 5, 4, 3, 4).distinct
res9: List[Int] = List(3, 5, 4)

scala> List('a', 'b', 'c', 'd') drop 2
res10: List[Char] = List(c, d)

scala> List(23, 8, 14, 21) filter (_ > 18)
res11: List[Int] = List(23, 21)

scala> List(List(1, 2), List(3, 4)).flatten
res12: List[Int] = List(1, 2, 3, 4)

scala> List(2, 3, 5, 7) slice (1, 3)
res13: List[Int] = List(3, 5)

scala> List("apple", "to").sorted
res14: List[String] = List(apple, to)

scala> List(2, 3, 5, 7) splitAt 2
res15: (List[Int], List[Int]) = (List(2, 3),List(5, 7))

scala> List(2, 3, 5, 7, 11, 13) take 3
res16: List[Int] = List(2, 3, 5)

scala> List(1, 2) zip List("a", "b")
res17: List[(Int, String)] = List((1,a), (2,b))

這次的集合就先到這邊,下次再跟大家說更多集合的用法喔!
有問題歡迎寄信跟我討論。

謝謝您的支持與鼓勵

Ads