天天看點

Scala集合Scala集合

Scala集合

scala預設采用不可變集合

一、集合概述:

1.Scala的集合有三大類: 序列Seq(有序、線性)、集合set、映射Map(Key->Value),所有的集合都擴充自Iterable特質 2.可變分類 不可變集合(可以安全的并發通路)【scala.collection.mutable】 (1)for循環的1to3生成的是IndexedSeq下的vector (2)String屬于IndexSeq (3)Queue和Stack屬于LinearSeq (4)IndexSeq通過索引查找定位,速度快 (5)LinearSeq是線性的,有起點和終點,一般通過周遊查找 可變集合【scala.collection.immutable】 可變集合的種類非常多,在Seq中還增加了Buffer(ArrayBuffer、ListBuffer)  

二、數組

1.Array是固定長度數組,ArrayBuffer是不固定長度 2.建立數組賦初值不要使用new關鍵字,不然是指定建立大小

Scala集合Scala集合
Scala集合Scala集合

3.未賦初值的數組元素都為0 4.用(i)來通路下标為i的元素 5.用for(element<-array)周遊 6.Scala Array對應的是java中的數組,不在Scala集合架構内  

三、元組

1.元組是不同類型值的聚集(是以修改元組内元素的類型一定要給每個元素都指定類型) 2.建立元組

Scala集合Scala集合

3.擷取元組内元素(根據下标)

Scala集合Scala集合

4.元組中最多隻能有 22個元素  

四、集合

1.主要的集合特質

Scala集合Scala集合

集合三大類:Seq、Set、Map   2.疊代器 内部疊代器:集合或疊代器的擁有者自己周遊集合,使用foreach方法,繼承Traversable特質 外部疊代器:Iterable提供了iterator方法,客戶代碼可以擷取疊代器進行自行周遊 Iterable允許隻使用集合部分元素的方法,比Traversable更早停止疊代,性能上比後者高。 使用疊代器Iterator(下圖)

Scala集合Scala集合

  3.Seq特質(有序、線性) (1)主要是通過length和apply方法定義的,apply方法根據有序序号進行索引操作,length方法傳回集合大小。

Scala集合Scala集合

(2)LinearSeq 此特質有3個方法:isEmpty、head、tail 這個特質可以看做是 頭元素(head)+tail(除掉頭元素以外的 集合)組成的集合(具體看下圖例子)

Scala集合Scala集合

(3)IndexSeq 與Seq特質類似,但是可以随機通路,更為高效。   4.Set特質 Set集合代表每個元素都是唯一的。 下面介紹幾種set (1)TreeSet 用紅黑樹實作,紅黑樹是一種試圖保持平衡的資料結構。     它通過檢查目前節點來查找樹裡的元素,如果目前節點大于期望值就查找左樹,如果小于期望值就查找右樹,正好等 于期望值就找到了正确節點。要想建立一個TreeSet,必須提供隐式的Ordering 類型以便比較大于小于。 拓展:什麼是紅黑樹  https://www.jianshu.com/p/e136ec79235c   (2)HashSet 用 樹結構實作集合。最大差別在于 HashSet 用元素的Hash值決定把元素放在哪個節 點上,HashSet 查找時的性能一般好于TreeSet。 (3)BitSet 是用Long 型的序列來實作的,BitSet 通過把其底層Long值與欲儲存的整數值位置設定 為true來儲存整數,BitSet經常用來在記憶體裡跟蹤和儲存一大批标志位。   5.Map特質 不可變的Map是有序的,可變的Map是無序的。 Map特質代表鍵值對的集合,隻有有鍵的值才能存在。Map提供了根據鍵查找值的高效實作。 Map的用法:

Scala集合Scala集合

應用例子:TreeMap  

五、集合的運算

1.map(元素的映射)和flatten(扁平化) (1)map:将集合中每個元素通過制定函數映射為新的結果集合(一一對應) ①可以作計算操作

Scala集合Scala集合
Scala集合Scala集合

②可以進行字元串的拆解

Scala集合Scala集合
Scala集合Scala集合
Scala集合Scala集合

(2).flatten: 可以通過flatmap和flatten操作将集合中每個元素通過定值函數映射為新的 扁平化結果集合。 關于flatMap和Map的對比和較長的描述可以看 下面這篇博文,講的挺形象的: https://blog.csdn.net/qq_21383435/article/details/77477681   扁平化:簡單直接 例子:通過flatten進行元素拼接

Scala集合Scala集合

  2.filter運算 資料篩選操作

Scala集合Scala集合

  3.fold/reduce(折疊/歸約操作) (1)reduce 二進制操作對集合中的元素進行歸約。 reduce包含reduceLeft和reduceRight兩種操作,前者從結合的頭部開始操作,後者是從尾部開始操作。 例如:求清單的和

Scala集合Scala集合

  (2)fold 折疊(fold)操作和reduce(歸約)操作比較類似。fold操作需要從一個初始的“種子”值開始,并以該值作為上下文,處理集合中的每個元素。 Fold包含兩個變體foldLeft和foldRight兩種操作,foldLeft第一個參數為累計值,集合周遊的方向是從左到右, foldRight第二個參數為累計值,集合周遊的方向是從右到左。

Scala集合Scala集合

4.scan(掃描操作) 掃描,即對某個集合的 所有元素做fold操作,但是會把 産生的所有中間結果放置于一個 集合中儲存

Scala集合Scala集合

5.zip(拉鍊操作,鍵和值映射起來)  

六、集合分類

1.分類方式: 可變集合和不可變集合 即使計算集合和延時計算集合 順序計算集合和并行計算集合   下面對集合分類進行舉例: 2.不可變集合Vector(後面用到的比較多) (1)Vector是由元素的 下标組成的字首樹, 帶索引的不可變序列容器。 如果想要用 鍊式不可變集合容器,使用 List。 Vector在快速随機通路和快速随機存取方面是比較均衡的,Vectors現在是 immutable indexed sequences的預設實作。 (2)字首樹 每個節點有幾個分叉,路徑上的數字為幾進制。 如0-7的字首樹用二叉樹表示:

Scala集合Scala集合

(3)“修改”Vector元素資料 例如:将下标0的位置修改為“new” 因為集合是不可變的,修改指定的下标值會産生新的集合,可以複用字首樹的部分資料。

Scala集合Scala集合

  3.不可變集合List List由兩個類組成,一個是代表空清單的Nil,另一個是Cons List是個不可變的單連結清單,适合在頭部的添加和删除操作。 List不适合中間元素的修改,如果修改則前面的元素都要重新生成,不如Vector   4.不可變集合Stream (1)Stream是一種延遲持久(lazy persistent)的集合,也就是說 流可以延遲計算其元素的值。 Stream類似于List,但是最大的差別就是在于Stream會延遲計算。 例子:(其中zip就是鍊式操作, 注意warning,現在可以用LazyList來代替Stream關鍵字)

Scala集合Scala集合

(2)Stream(LizyList)構造 List的構造為cons(::) Stream的構造為#:: LazyList.empty表示空流,不是Nil

Scala集合Scala集合

構造了有三個成員的流對象 我們可以看到:在使用到對象的時候才進行建立對象并輸出相應的内容,延遲建立   5.可變集合ArrayBuffer 要使用或者建立可變集合必須使用這個包 scala.collection.mutable下的集合。 ArrayBuffer是一種可變數組,其大小與其所含的元素數不一定一緻,當添加新元素到 ArrayBuffer時,如果底層數組沒有滿,則這個元素直接加入到數組,如果底層數組滿了,則要建立 更大的數組,把元素都複制到新數組中。ArrayBuffer 對應了 java util 的ArrayList   6.視圖(view) Scala集合預設是嚴格和串行計算的,嚴格計算是指非延遲計算。 (1)集合庫通過兩個标準機制來把預設執行方式 轉化為 并行計算 或者 延遲計算,分别是 view和par 從Seq[T]通過view方法轉化為SeqView[T, ]類型,可以 實作懶操作(延遲計算)。 seqview的官方API https://www.scala-lang.org/api/current/scala/collection/SeqView.html (2)小例子:

Scala集合Scala集合

傳回的是集合視圖,由傳回值可以看到,還沒有計算。

Scala集合Scala集合

等價于:

Scala集合Scala集合

  7.并行集合 Scala并行集合是操作并行化的集合。并行集合實作了一種“可拆分”的疊代器

Scala集合Scala集合