過時公告
Seq 特徵表示序列。序列是一種可迭代的項目,具有 length
,其元素具有從 0
開始的固定索引位置。
序列上的操作,總結在以下表格中,可分為下列類別
- 索引和長度 操作
apply
、isDefinedAt
、length
、indices
和lengthCompare
。對於Seq
,apply
操作表示索引;因此,類型為Seq[T]
的序列是一個部分函數,它接收一個Int
參數(一個索引),並產生一個類型為T
的序列元素。換句話說,Seq[T]
延伸PartialFunction[Int, T]
。序列的元素從零開始索引,直到序列的length
減一。序列上的length
方法是通用集合的size
方法的別名。lengthCompare
方法允許您將序列的長度與一個 Int 進行比較,即使序列具有無限長度。 - 索引搜尋操作
indexOf
、lastIndexOf
、indexOfSlice
、lastIndexOfSlice
、indexWhere
、lastIndexWhere
、segmentLength
、prefixLength
,它們會傳回一個元素的索引,該元素等於給定的值或符合某些謂詞。 - 加法運算
+:
、:+
、padTo
,這些運算會回傳新的序列,這些序列是透過在序列的開頭或結尾加入元素而取得的。 - 更新運算
updated
、patch
,這些運算會回傳新的序列,這些序列是透過替換原始序列中的一些元素而取得的。 - 排序運算
sorted
、sortWith
、sortBy
,這些運算會根據不同的準則對序列元素進行排序。 - 反轉運算
reverse
、reverseIterator
、reverseMap
,這些運算會產生或處理序列元素的相反順序。 - 比較
startsWith
、endsWith
、contains
、containsSlice
、corresponds
,這些運算會關聯兩個序列或在序列中搜尋元素。 - 多重集合 運算
intersect
、diff
、union
、distinct
,這些運算會對兩個序列的元素執行類似集合的運算,或移除重複的元素。
如果序列是可以變動的,它除了提供有副作用的 update
方法外,還能讓序列元素更新。在 Scala 中,語法就像 seq(idx) = elem
只是 seq.update(idx, elem)
的簡寫,所以 update
提供了方便的賦值語法。請注意 update
和 updated
之間的差異。update
會就地變更序列元素,而且僅適用於可變動的序列。updated
適用於所有序列,而且總是會傳回新的序列,而不是修改原始序列。
Seq 類別中的操作
它是什麼 | 它的作用 |
---|---|
索引和長度 | |
xs(i) |
(或者寫成 xs apply i )。xs 中索引為 i 的元素。 |
xs isDefinedAt i |
測試 i 是否包含在 xs.indices 中。 |
xs.length |
序列的長度 (與 size 相同)。 |
xs lengthCompare n |
如果 xs 比 n 短,傳回 -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) |
序列結果來自於附加值 x 到 xs 直到長度 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.Seq s)。將 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) |
測試 xs 和 ys 的對應元素是否滿足二元謂詞 p 。 |
多重集合運算 | |
xs 與 ys 相交 |
序列 xs 和 ys 的多重集合交集,保留 xs 中元素的順序。 |
xs 減去 ys |
序列 xs 和 ys 的多重集合差集,保留 xs 中元素的順序。 |
xs 聯集 ys |
多重集合聯集;與 xs ++ ys 相同。 |
xs.distinct |
不包含重複元素的 xs 子序列。 |
特徵 Seq 有兩個子特徵 LinearSeq 和 IndexedSeq。它們不會新增任何新操作,但各自提供不同的效能特性:線性序列具有有效率的 head
和 tail
操作,而索引序列具有有效率的 apply
、length
,以及(如果可變)update
操作。經常使用的線性序列為 scala.collection.immutable.List
和 scala.collection.immutable.Stream
。經常使用的索引序列為 scala.Array
和 scala.collection.mutable.ArrayBuffer
。 Vector
類別在索引和線性存取之間提供一個有趣的折衷方案。它同時具有有效率的常數時間索引開銷和常數時間線性存取開銷。因此,向量是混合存取模式(同時使用索引和線性存取)的良好基礎。您會在 稍後 瞭解更多有關向量的資訊。
緩衝區
可變序列的一個重要子類別是 Buffer
。它們不僅允許更新現有元素,還允許插入元素、移除元素,以及在緩衝區的尾端有效新增新元素。緩衝區支援的主要新方法是 +=
和 ++=
,用於在尾端新增元素;+=:
和 ++=:
,用於在前端新增元素;insert
和 insertAll
,用於插入元素;以及 remove
和 -=
,用於移除元素。這些操作摘要在以下表格中。
緩衝區的兩個常見實作是 ListBuffer
和 ArrayBuffer
。如同其名稱所示,ListBuffer
以 List
為後盾,並支援有效率地將其元素轉換成 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 具有相同元素的新緩衝區。 |