Scala教學(六)集合
今天要跟大家介紹的是在寫程式很常使用的 集合
。常用的包含 Lists
、 Sets
和 Maps
。
Quick Start
接下來將要分享我的Scala
學習筆記,有任何建議與需要改進的地方,也請大家多多指教。
參考書籍Learning Scala
Lists
直接看範例怎麼使用的:1
2
3
4
5scala> 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
8scala> 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
4scala> for (c <- colors) { println(c) }
red
green
blue
结合Scala教學(五)進階函式所學
使用
foreach
時,無返回值1
2
3
4
5
6
7scala> 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
2scala> val sizes = colors.map( (c: String) => c.size )
sizes: List[Int] = List(3, 5, 4)使用
reduce
,可將兩個值合成一個值1
2
3
4
5scala> 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
2scala> val unique = Set(10, 20, 30, 20, 20, 10)
unique: scala.collection.immutable.Set[Int] = Set(10, 20, 30)
使用 ::
建構 List
除了傳統的 List(...)
這種寫法外,還可以使用 Nil
與 ::
結合的方式進行 List
的宣告
如:1
2scala> 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
38scala> 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))
這次的集合就先到這邊,下次再跟大家說更多集合的用法喔!
有問題歡迎寄信跟我討論。
Donate
謝謝您的支持與鼓勵