Scala集合
Scala提供了一套很好的集合實現,提供了一些集合類型的抽象。java
Scala 集合分爲可變的和不可變的集合。數組
可變集合能夠在適當的地方被更新或擴展。這意味着你能夠修改,添加,移除一個集合的元素。而不可變集合類永遠不會改變。不過,你仍然能夠模擬添加,移除或更新操做。可是這些操做將在每一種狀況下都返回一個新的集合,同時使原來的集合不發生改變。緩存
集合中基本結構:函數
幾種經常使用集合類型示例:測試
-
-
val x = List(
1, 2, 3, 4)
-
-
-
-
-
-
val x = Map(
"one" -> 1, "two" -> 2, "three" -> 3)
-
-
-
-
-
-
val x: Option[Int] = Some(
5)
Scala List(列表)
Scala 列表相似於數組,它們全部元素的類型都相同,可是它們也有所不一樣:列表是不可變的,值一旦被定義了就不能改變,其次列表 具備遞歸的結構(也就是連接表結構)而數組不是。spa
列表的元素類型 T 能夠寫成 List[T]。例如,如下列出了多種類型的列表:scala
-
-
val site: List[String] = List(
"Sina", "Google", "Baidu")
-
-
-
val nums: List[Int] = List(
1, 2, 3, 4)
-
-
-
val empty: List[Nothing] = List()
-
-
-
val dim: List[List[Int]] =
-
-
-
-
-
構造列表的兩個基本單位是 Nil 和 ::code
Nil 也能夠表示爲一個空列表。對象
以上實例咱們能夠寫成以下所示:(::)符號鏈接順序是從右到左blog
-
-
val site =
"Sina" :: ("Google" :: ("Baidu" :: Nil))
-
-
-
val nums =
1 :: (2 :: (3 :: (4 :: Nil)))
-
-
-
-
-
-
val dim = (
1 :: (0 :: (0 :: Nil))) ::
-
(
0 :: (1 :: (0 :: Nil))) ::
-
(
0 :: (0 :: (1 :: Nil))) :: Nil
基本操做
Scala列表有三個基本操做:
- head 返回列表第一個元素
- tail 返回一個列表,包含除了第一元素以外的其餘元素:(是一個列表或者Nil)
- isEmpty 在列表爲空時返回true
對於Scala列表的任何操做均可以使用這三個基本操做來表達。代碼示例以下:
-
val site =
"Sina" :: ("Google" :: ("Baidu" :: Nil))
-
-
-
-
-
-
打印結果爲:
-
-
-
-
鏈接列表
你可使用 ::: 、 List.:::() 或 List.concat() 方法來鏈接兩個或多個列表。
代碼示例以下:
-
val site1 =
"Sina" :: ("Google" :: ("Baidu" :: Nil))
-
val site2 =
"Facebook" :: ("Taobao" :: Nil)
-
-
-
var combine = site1 :::
site2
-
println( "site1 ::: site2 : " + combine )
-
-
-
combine = site1.:::(site2)
-
println(
"site1.:::(site2) : " + combine )
-
-
-
combine = List.concat(site1, site2)
-
println(
"List.concat(site1, site2) : " + combine )
-
打印結果:
-
site1 ::: site2 : List(Sina, Google, Baidu, Facebook, Taobao)
-
site1.:::(site2) : List(Facebook, Taobao, Sina, Google, Baidu)
-
List.concat(site1, site2) : List(Sina, Google, Baidu, Facebook, Taobao)
List.fill()
咱們可使用 List.fill() 方法來建立一個指定重複數量的元素列表:
-
val site = List.fill(
3)("Baidu")
-
println(
"site : " + site )
-
-
val num = List.fill(
10)(2)
-
println(
"num : " + num )
打印結果爲:
-
site : List(Baidu, Baidu, Baidu)
-
num : List(
2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
List.tabulate()
List.tabulate() 方法是經過給定的函數來建立列表。
方法的第一個參數爲元素的數量,能夠是二維的,第二個參數爲指定的函數,咱們經過指定的函數計算結果並返回值插入到列表中,起始值爲 0,實例以下:
-
-
val squares = List.tabulate(
6)(n => n * n)
-
println(
"一維 : " + squares )
-
-
-
val mul = List.tabulate(
4,5 )( _ * _ )
-
打印結果爲:
-
一維 : List(
0, 1, 4, 9, 16, 25)
-
二維 : List(List(
0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))
List.reverse
List.reverse 用於將列表的順序反轉,實例以下:
-
val site =
"Sina" :: ("Google" :: ("Baidu" :: Nil))
-
println(
"反轉前 : " + site )
-
println(
"反轉前 : " + site.reverse )
打印結果爲:
-
反轉前 : List(Sina, Google, Baidu)
-
反轉前 : List(Baidu, Google, Sina)
列表緩存(ListBuffer)
List類可以提供對列表頭部,而非尾部的快速訪問。若是須要向結尾添加對象,則須要先對錶頭前綴元素方式反向構造列表,完成以後再調用reverse。
上述問題另外一種解決方式就是使用ListBuffer,這能夠避免reverse操做。ListBuffer是可變對象,它能夠更高效的經過添加元素來構建列表。
使用ListBuffer替代List另外一個理由是避免棧溢出風險。
ListBuffer使用示例:
-
val buf: ListBuffer[Int] =
new ListBuffer[Int]
-
-
-
-
-
-
-
-
-
-
println(buf2.toList.toString())
List經常使用方法
Scala隊列和棧
隊列
若是你須要先進先出序列,你可使用Queue(隊列)。Scala集合提供了可變和不可變的Queue。
不可變Queue代碼示例:
-
-
-
-
-
val que1 = que.enqueue(
1)
-
-
-
val que2 = que1.enqueue(List(
2,3,4,5))
-
-
-
-
val (elem1,que3) = que2.dequeue
-
-
-
-
-
-
打印結果爲:
-
-
可變Queue代碼示例:
-
-
var que = scala.collection.mutable.Queue[String]()
-
-
-
-
-
-
que ++= List(
"B","C","D")
-
-
-
-
-
-
-
-
-
打印結果:
-
-
棧
若是須要的是後進先出,你可使用Stack,它一樣在Scala的集合中有可變和不可變版本。元素的推入使用push,彈出用pop,只獲取棧頂元素而不移除可使用top。
可變棧示例:
-
-
var stack = scala.collection.mutable.Stack[Int]()
-
-
-
-
-
-
-
-
-
-
-
-
println("棧頂元素爲 : " + tval)
-
-
-
-
println(
"移除的棧頂元素爲 : " + pval)
-
-
-
打印結果:
-
-
-
-
隊列和棧經常使用操做
Scala Set(集)
- Scala Set(集)是沒有重複的對象集合,全部的元素都是惟一的。
- Scala 集合分爲可變的和不可變的集合。
- 默認狀況下,Scala 使用的是不可變集合,若是想使用可變集合,需引用 scala.collection.mutable.Set 包。
- 默認引用 scala.collection.immutable.Set。
不可變集合實例以下:
-
-
println(set.getClass.getName)
-
-
println(set.exists(_ %
2 == 0))
-
打印結果爲:
-
scala.collection.immutable.
Set$Set3
-
-
若是須要使用可變集合須要引入 scala.collection.mutable.Set:
-
import scala.collection.mutable.Set
-
-
val mutableSet = Set(
1,2,3)
-
println(mutableSet.getClass.getName)
-
-
-
-
-
-
-
-
-
-
-
-
val another = mutableSet.
toSet
-
println(another.getClass.getName)
注意: 雖然可變Set和不可變Set都有添加或刪除元素的操做,可是有一個很是大的差異。對不可變Set進行操做,會產生一個新的set,原來的set並無改變,這與List同樣。 而對可變Set進行操做,改變的是該Set自己,與ListBuffer相似。
Set集合基本操做
Scala Set集合有三個基本操做:
- head 返回集合第一個元素
- tail 返回一個集合,包含除了第一元素以外的其餘元素
- isEmpty 在集合爲空時返回true
對於Scala集合的任何操做均可以使用這三個基本操做來表達。
代碼示例以下:
-
val site = Set(
"Sina", "Google", "Baidu")
-
val nums: Set[Int] = Set()
-
-
println(
"head : " + site.head )
-
println(
"tail : " + site.tail )
-
println(
"isEmpty : " + site.isEmpty )
-
println(
"isEmpty : " + nums.isEmpty )
打印結果爲:
-
-
tail : Set(Google, Baidu)
-
-
鏈接集合
你可使用 ++ 運算符或 Set.++() 方法來鏈接兩個集合。若是元素有重複的就會移除重複的元素。實例以下:
-
val site1 = Set(
"Sina", "Google", "Baidu")
-
val site2 = Set(
"Faceboook", "Taobao")
-
-
-
var site = site1 ++
site2
-
println( "site1 ++ site2 : " + site )
-
-
-
-
println(
"site1.++(site2) : " + site )
打印結果爲:
-
site1 ++ site2 : Set(Faceboook, Taobao, Sina, Google, Baidu)
-
site1.++(site2) : Set(Faceboook, Taobao, Sina, Google, Baidu)
查找集合中最大與最小元素
你可使用 Set.min 方法來查找集合中的最小元素,使用 Set.max 方法查找集合中的最大元素。實例以下:
-
val num = Set(
5,6,9,20,30,45)
-
-
-
println(
"Set(5,6,9,20,30,45) 最小元素是 : " + num.min )
-
println(
"Set(5,6,9,20,30,45) 最大元素是 : " + num.max )
打印結果爲:
-
Set(
5,6,9,20,30,45) 最小元素是 : 5
-
Set(
5,6,9,20,30,45) 最大元素是 : 45
交集
你可使用 Set.& 方法或 Set.intersect 方法來查看兩個集合的交集元素。實例以下:
-
val num1 = Set(
5,6,9,20,30,45)
-
val num2 = Set(
50,60,9,20,35,55)
-
-
-
println(
"num1.&(num2) : " + num1.&(num2) )
-
println(
"num1.intersect(num2) : " + num1.intersect(num2) )
打印結果爲:
-
num1.&(num2) : Set(
20, 9)
-
num1.intersect(num2) : Set(
20, 9)
Scala Set 經常使用方法
Scala Map(映射)
- Map(映射)是一種可迭代的鍵值對(key/value)結構。
- 全部的值均可以經過鍵來獲取。
- Map 中的鍵都是惟一的。
- Map 也叫哈希表(Hash tables)。
- Map 有兩種類型,可變與不可變,區別在於可變對象能夠修改它,而不可變對象不能夠。
- 默認狀況下 Scala 使用不可變 Map。若是你須要使用可變集合,你須要顯式的引入 import scala.collection.mutable.Map 類
- 在 Scala 中 你能夠同時使用可變與不可變 Map,不可變的直接使用 Map,可變的使用 mutable.Map。
如下實例演示了不可變 Map 的應用:
-
-
var A:Map[Char,Int] = Map()
-
-
-
val lang= Map(
"Java" -> "Oracle", "C#" -> "Microsoft")
-
-
val lang= Map((
"Java","Oracle"), ("C#" , "Microsoft"))
定義 Map 時,須要爲鍵值對定義類型。若是須要添加 key-value 對,可使用 + 號,以下所示:
A += ('t' ->10 )
Map 基本操做
Scala Map 幾種基本操做:keys、values、isEmpty、賦值(可變映射)
代碼示例:
Keys:
-
val lang = Map(
"Java" -> "Oracle",
-
-
-
-
val nums: Map[Int, Int] = Map()
-
println(
"lang 中的鍵爲 : " + lang.keys )
-
println(
"lang 中的值爲 : " + lang.values )
isEmpty:
-
println(
"lang 是否爲空 : " + lang.isEmpty )
-
println(
"nums 是否爲空 : " + nums.isEmpty )
keys和isEmpty的打印結果爲:
-
lang 中的鍵爲 : Set(Java, C#, Swift)
-
lang 中的值爲 : MapLike(Oracle, Microsoft, Apple)
-
-
賦值:
-
var lang= scala.collection.mutable.Map(
"Java" -> "Oracle", "C#" -> "Microsoft")
-
-
打印結果爲:
Map(C# -> Microsoft, Java -> sun)
Map 合併
你可使用 ++ 運算符或 Map.++() 方法來鏈接兩個 Map,Map 合併時會移除重複的 key。如下演示了兩個 Map 合併的實例:
-
val lang =Map(
"Java" -> "Oracle",
-
-
-
val color = Map(
"blue" -> "#0033FF",
-
-
-
-
-
var colors = lang ++
color
-
println( "lang ++ colors : " + colors )
-
-
-
-
println(
"lang.++(colors)) : " + colors )
打印結果爲:
-
lang ++ colors : Map(blue -> #
0033FF, C# -> Microsoft, yellow -> #FFFF00, Java -> Oracle, red -> #FF0000, Swift -> Apple)
-
lang.++(colors)) : Map(blue -> #
0033FF, C# -> Microsoft, yellow -> #FFFF00, Java -> Oracle, red -> #FF0000, Swift -> Apple)
輸出 Map 的 keys 和 values
如下經過 foreach 循環輸出 Map 中的 keys 和 values:
-
val lang =Map(
"Java" -> "Oracle",
-
-
-
-
-
-
println(
"\tValue = " + lang(i) )}
打印結果爲:
-
-
Key = C#Value = Microsoft
-
查看 Map 中是否存在指定的 Key
你可使用 Map.contains 方法來查看 Map 中是否存在指定的 Key。實例以下:
-
val lang =Map(
"Java" -> "Oracle",
-
-
-
-
if(lang.contains("Swift")) {
-
println(lang(
"Swift")+"創造了 Swift 語言")
-
打印結果爲:
Apple創造了 Swift 語言
迭代映射
-
val lang = Map(
"Java" -> "Oracle", "C#" -> "Microsoft")
-
-
-
打印結果爲:
-
-
映射中K,V反轉
-
val lang = Map(
"Java" -> "Oracle", "C#" -> "Microsoft")
-
val lang2 =
for ((k, v) <- lang) yield (v, k)
-
-
-
打印結果爲:
-
-
已排序映射
-
-
val scores = scala.collection.immutable.SortedMap((
"Bob", 8), ("Alice", 21), ("Fred", 17), ("Cindy", 15))
-
scores.foreach(person => println(person._1 +
" : " + person._2))
打印結果爲:
-
-
-
-
Scala Map經常使用方法
Scala Tuple(元組)
與列表同樣,元組也是不可變的,但與列表不一樣的是元組能夠包含不一樣類型的元素。
元組的值是經過將單個的值包含在圓括號中構成的。例如:
-
-
val tuple1 = (
1, 5.20, "Spark")
-
-
val tuple2 =
new Tuple3(1,5.20,"Spark")
咱們可使用 tuple1._1 訪問第一個元素, tuple1._2 訪問第二個元素,以下所示:
-
-
val tuple1 = (
1, 5.20, "Spark")
-
-
println(tuple1._1 +
" : " + tuple1._2 + " : " + tuple1._3)
打印結果爲:
1 : 5.2 : Spark
迭代元組
你可使用 Tuple.productIterator() 方法來迭代輸出元組的全部元素:
-
-
val tuple1 = (
1, 5.20, "Spark")
-
-
tuple1.productIterator.foreach{i => println(
"value : " + i)}
打印結果爲:
-
-
-
元組轉爲字符串
你可使用 Tuple.toString() 方法將元組的全部元素組合成一個字符串,實例以下:
-
-
val tuple1 = (
1, 5.20, "Spark")
-
-
println(tuple1.toString())
打印結果爲:
(1,5.2,Spark)
元素交換
你可使用 Tuple.swap 方法來交換元組的元素。以下實例:
-
-
val tuple1 = (
1, "Spark")
-
-
打印結果爲:
(Spark,1)
使用模式匹配獲取元組
代碼示例:
-
val t = (
1, 3.14, "Fred")
-
val (first, second, third) =
t
-
println(first + " : " + second + " : " + third)
打印結果:
1 : 3.14 : Fred
拉鍊操做
-
val num = Array(
1, 2, 3)
-
val str = Array(
"first", "second", "third")
-
val com = num.zip(str).
toMap
-
println(com(1)+" : "+com(2)+" : "+com(3))
打印結果爲:
first : second : third
元組經常使用方法
Scala Option(選項)
Scala Option(選項)類型用來表示一個值是可選的(有值或無值)。
Option[T] 是一個類型爲 T 的可選值的容器: 若是值存在, Option[T] 就是一個 Some[T] ,若是不存在, Option[T] 就是對象 None 。
代碼示例:
-
val myMap: Map[String, String] = Map(
"key1" -> "value")
-
val value1: Option[String] = myMap.get(
"key1")
-
val value2: Option[String] = myMap.get(
"key2")
-
-
-
打印結果爲:
-
-
Option 有兩個子類別,一個是 Some,一個是 None,當他回傳 Some 的時候,表明這個函式成功地給了你一個 String,而你能夠透過 get() 這個函式拿到那個 String,若是他返回的是 None,則表明沒有字符串能夠給你。
經過模式匹配來輸出匹配值。
代碼示例:
-
val lang =Map(
"Java" -> "Oracle",
-
-
-
-
println(show(lang.get(
"Swift")))
-
println(show(lang.get(
"Scala")))
-
-
def show(x:Option[String]) = x match {
-
-
-
打印結果爲:
-
-
getOrElse() 方法
你可使用 getOrElse() 方法來獲取元組中存在的元素或者使用其默認的值,實例以下:
-
val a:Option[Int] = Some(
5)
-
val b:Option[Int] = Some(
7)
-
-
-
println("a.getOrElse(0): " + a.getOrElse(0) )
-
println("b.getOrElse(1): " + b.getOrElse(1) )
-
println("c.getOrElse(10): " + c.getOrElse(10))
打印結果爲:
-
-
-
isEmpty() 方法
你可使用 isEmpty() 方法來檢測元組中的元素是否爲 None,實例以下:
-
val a:Option[Int] = Some(
5)
-
-
println("a.isEmpty: " + a.isEmpty )
-
println("b.isEmpty: " + b.isEmpty )
打印結果爲:
-
-
Scala Option 經常使用方法
Scala Iterator(迭代器)
- Scala Iterator(迭代器)不是一個集合,它是一種用於訪問集合的方法。
- 迭代器 it 的兩個基本操做是 next 和 hasNext。
- 調用 it.next() 會返回迭代器的下一個元素,而且更新迭代器的狀態。
- 調用 it.hasNext() 用於檢測集合中是否還有元素。
讓迭代器 it 逐個返回全部元素最簡單的方法是使用 while 循環:
-
val it = Iterator(
"Baidu", "Google", "Tencent", "Taobao")
-
-
-
-
打印結果爲:
-
-
-
-
查找最大與最小元素
你可使用 it.min 和 it.max 方法從迭代器中查找最大與最小元素,實例以下:
-
val ita = Iterator(
20, 40, 2, 50, 69, 90)
-
val itb = Iterator(
20, 40, 2, 50, 69, 90)
-
-
println(
"最大元素是:" + ita.max)
-
println(
"最小元素是:" + itb.min)
執行結果爲:
-
-
獲取迭代器的長度
你可使用 it.size 或 it.length 方法來查看迭代器中的元素個數。實例以下:
-
val ita = Iterator(
20, 40, 2, 50, 69, 90)
-
val itb = Iterator(
20, 40, 2, 50, 69, 90)
-
-
println(
"ita.size : " + ita.size)
-
println(
"itb.length : " + itb.length)
打印結果爲:
-
-
Scala Iterator 經常使用方法
附錄:
List經常使用方法
隊列和棧經常使用操做
Scala Set 經常使用方法
Scala Map經常使用方法
元組經常使用方法
Scala Option 經常使用方法
Scala Iterator 經常使用方法