集合 (Scala 2.8 - 2.12)

序列特徵 Seq、IndexedSeq 和 LinearSeq

語言

Seq 特徵表示序列。序列是一種可迭代的項目,具有 length,其元素具有從 0 開始的固定索引位置。

序列上的操作,總結在以下表格中,可分為下列類別

  • 索引和長度 操作 applyisDefinedAtlengthindiceslengthCompare。對於 Seqapply 操作表示索引;因此,類型為 Seq[T] 的序列是一個部分函數,它接收一個 Int 參數(一個索引),並產生一個類型為 T 的序列元素。換句話說,Seq[T] 延伸 PartialFunction[Int, T]。序列的元素從零開始索引,直到序列的 length 減一。序列上的 length 方法是通用集合的 size 方法的別名。lengthCompare 方法允許您將序列的長度與一個 Int 進行比較,即使序列具有無限長度。
  • 索引搜尋操作 indexOflastIndexOfindexOfSlicelastIndexOfSliceindexWherelastIndexWheresegmentLengthprefixLength,它們會傳回一個元素的索引,該元素等於給定的值或符合某些謂詞。
  • 加法運算 +::+padTo,這些運算會回傳新的序列,這些序列是透過在序列的開頭或結尾加入元素而取得的。
  • 更新運算 updatedpatch,這些運算會回傳新的序列,這些序列是透過替換原始序列中的一些元素而取得的。
  • 排序運算 sortedsortWithsortBy,這些運算會根據不同的準則對序列元素進行排序。
  • 反轉運算 reversereverseIteratorreverseMap,這些運算會產生或處理序列元素的相反順序。
  • 比較 startsWithendsWithcontainscontainsSlicecorresponds,這些運算會關聯兩個序列或在序列中搜尋元素。
  • 多重集合 運算 intersectdiffuniondistinct,這些運算會對兩個序列的元素執行類似集合的運算,或移除重複的元素。

如果序列是可以變動的,它除了提供有副作用的 update 方法外,還能讓序列元素更新。在 Scala 中,語法就像 seq(idx) = elem 只是 seq.update(idx, elem) 的簡寫,所以 update 提供了方便的賦值語法。請注意 updateupdated 之間的差異。update 會就地變更序列元素,而且僅適用於可變動的序列。updated 適用於所有序列,而且總是會傳回新的序列,而不是修改原始序列。

Seq 類別中的操作

它是什麼 它的作用
索引和長度  
xs(i) (或者寫成 xs apply i)。xs 中索引為 i 的元素。
xs isDefinedAt i 測試 i 是否包含在 xs.indices 中。
xs.length 序列的長度 (與 size 相同)。
xs lengthCompare n 如果 xsn 短,傳回 -1;如果較長,傳回 +1;如果長度為 n,傳回 0。即使序列是無限的,此方法也能運作,例如 Stream.from(1) lengthCompare 42 等於 +1
xs.indices xs 的索引範圍從 0 延伸到 xs.length - 1
索引搜尋  
xs indexOf x xs 中第一個等於 x 的元素的索引(有數個變體)。
xs lastIndexOf x xs 中最後一個等於 x 的元素的索引(有數個變體)。
xs indexOfSlice ys xs 的第一個索引,從該索引開始的連續元素形成序列 ys
xs lastIndexOfSlice ys xs 的最後一個索引,從該索引開始的連續元素形成序列 ys
xs indexWhere p xs 中第一個滿足 p 的元素的索引(有數個變體)。
xs segmentLength (p, i) xs 中元素的最長不中斷區段的長度,從 xs(i) 開始,所有元素都滿足謂詞 p
xs prefixLength p xs 中元素的最長前綴的長度,所有元素都滿足謂詞 p
新增  
x +: xs 一個新的序列,包含附加到 xs 前面的 x
xs :+ x 一個新的序列,包含附加到 xs 後面的 x
xs padTo (len, x) 序列結果來自於附加值 xxs 直到長度 len 達到。
更新  
xs patch (i, ys, r) 序列結果來自於替換 r 元素的 xs 起始於 i 由修補程式 ys
xs updated (i, x) 一個 xs 的副本,索引 i 中的元素替換為 x
xs(i) = x (或寫出來,xs.update(i, x),僅適用於 mutable.Seqs)。將 xs 中索引 i 的元素變更為 x
排序  
xs.sorted 一個新的序列,透過使用 xs 的元素類型的標準排序來排序 xs 的元素所取得。
xs sortWith lt 一個新的序列,透過使用 lt 作為比較運算來排序 xs 的元素所取得。
xs sortBy f 一個新的序列,透過排序 xs 的元素所取得。在兩個元素之間的比較透過將函式 f 映射到兩者並比較結果來進行。
反轉  
xs.reverse 一個序列,其中 xs 的元素以反向順序排列。
xs.reverseIterator 一個迭代器,以反向順序產生 xs 的所有元素。
xs reverseMap f 一個序列,透過將 f 映射到 xs 的元素(以反向順序)所取得。
比較  
xs 以 ys 開頭 測試 xs 是否以序列 ys 開頭(有數個變體)。
xs 以 ys 結尾 測試 xs 是否以序列 ys 結尾(有數個變體)。
xs 包含 x 測試 xs 是否有一個元素等於 x
xs 包含片段 ys 測試 xs 是否有一個連續子序列等於 ys
(xs 對應 ys)(p) 測試 xsys 的對應元素是否滿足二元謂詞 p
多重集合運算  
xs 與 ys 相交 序列 xsys 的多重集合交集,保留 xs 中元素的順序。
xs 減去 ys 序列 xsys 的多重集合差集,保留 xs 中元素的順序。
xs 聯集 ys 多重集合聯集;與 xs ++ ys 相同。
xs.distinct 不包含重複元素的 xs 子序列。

特徵 Seq 有兩個子特徵 LinearSeqIndexedSeq。它們不會新增任何新操作,但各自提供不同的效能特性:線性序列具有有效率的 headtail 操作,而索引序列具有有效率的 applylength,以及(如果可變)update 操作。經常使用的線性序列為 scala.collection.immutable.Listscala.collection.immutable.Stream。經常使用的索引序列為 scala.Arrayscala.collection.mutable.ArrayBufferVector 類別在索引和線性存取之間提供一個有趣的折衷方案。它同時具有有效率的常數時間索引開銷和常數時間線性存取開銷。因此,向量是混合存取模式(同時使用索引和線性存取)的良好基礎。您會在 稍後 瞭解更多有關向量的資訊。

緩衝區

可變序列的一個重要子類別是 Buffer。它們不僅允許更新現有元素,還允許插入元素、移除元素,以及在緩衝區的尾端有效新增新元素。緩衝區支援的主要新方法是 +=++=,用於在尾端新增元素;+=:++=:,用於在前端新增元素;insertinsertAll,用於插入元素;以及 remove-=,用於移除元素。這些操作摘要在以下表格中。

緩衝區的兩個常見實作是 ListBufferArrayBuffer。如同其名稱所示,ListBufferList 為後盾,並支援有效率地將其元素轉換成 List,而 ArrayBuffer 則以陣列為後盾,並可以快速轉換成陣列。

緩衝區類別中的操作

它是什麼 它的作用
新增  
buf += x 將元素 x 附加到緩衝區,並傳回 buf 本身作為結果。
buf += (x, y, z) 將指定的元素附加到緩衝區。
buf ++= xs xs 中的所有元素附加到緩衝區。
x +=: buf 將元素 x 前置到緩衝區。
xs ++=: buf xs 中的所有元素前置到緩衝區。
buf insert (i, x) 在緩衝區的索引 i 處插入元素 x
buf insertAll (i, xs) 在緩衝區的索引 i 處插入 xs 中的所有元素。
移除  
buf -= x 從緩衝區移除元素 x
buf remove i 從緩衝區移除索引 i 處的元素。
buf remove (i, n) 從緩衝區移除從索引 i 開始的 n 個元素。
buf trimStart n 從緩衝區移除前 n 個元素。
buf trimEnd n 移除緩衝區中最後 n 個元素。
buf.clear() 移除緩衝區中的所有元素。
複製  
buf.clone 一個與 buf 具有相同元素的新緩衝區。

此頁面的貢獻者