集合

從頭建立集合

語言

您可以使用語法 List(1, 2, 3) 建立三個整數的清單,並使用 Map('A' -> 1, 'C' -> 2) 建立具有兩個繫結的映射。這實際上是 Scala 集合的通用功能。您可以取用任何集合名稱,並在括號中加上元素清單。結果將會是具有指定元素的新集合。以下是更多範例

val a = Iterable()                // An empty collection
val b = List()                    // The empty list
val c = List(1.0, 2.0)            // A list with elements 1.0, 2.0
val d = Vector(1.0, 2.0)          // A vector with elements 1.0, 2.0
val e = Iterator(1, 2, 3)         // An iterator returning three integers.
val f = Set(dog, cat, bird)       // A set of three animals
val g = HashSet(dog, cat, bird)   // A hash set of the same animals
val h = Map('a' -> 7, 'b' -> 0)   // A map from characters to integers

「在幕後」以上每一行都是對某個物件的 apply 方法的呼叫。例如,上面第三行展開為

val c = List.apply(1.0, 2.0)

因此這是對 List 類別的伴隨物件的 apply 方法的呼叫。該方法會接受任意數量的引數,並根據這些引數建構一個清單。Scala 函式庫中的每個集合類別都有包含此類 apply 方法的伴隨物件。集合類別表示具體實作(例如 ListLazyListVector)或抽象基本類別(例如 SeqSetIterable)並無所謂。在後一種情況下,呼叫 apply 會產生抽象基本類別的一些預設實作。範例

scala> List(1, 2, 3)
val res17: List[Int] = List(1, 2, 3)

scala> Iterable(1, 2, 3)
val res18: Iterable[Int] = List(1, 2, 3)

scala> mutable.Iterable(1, 2, 3)
val res19: scala.collection.mutable.Iterable[Int] = ArrayBuffer(1, 2, 3)

除了 apply,每個集合伴隨物件也會定義一個成員 empty,它會傳回一個空的集合。因此,您可以寫 List.empty 而不是 List(),寫 Map.empty 而不是 Map(),以此類推。

集合伴隨物件提供的作業摘要在下列表格中。簡而言之,有

  • concat,它會串接任意數量的集合,
  • filltabulate,它們會產生由某個運算式或製表函式初始化的單一或多維集合,其維度由給定的維度決定,
  • range,會產生具有某個常數步長的整數集合,以及
  • iterateunfold,會產生重複將某個函式套用至開始元素或狀態而產生的集合。

序列的工廠方法

它是什麼 它的作用
C.empty 空的集合。
C(x, y, z) 包含元素 x, y, z 的集合。
C.concat(xs, ys, zs) 透過串接 xs, ys, zs 的元素而取得的集合。
C.fill(n){e} 長度為 n 的集合,其中每個元素都是透過運算式 e 計算出來的。
C.fill(m, n){e} 維度為 m×n 的集合集合,其中每個元素都是透過運算式 e 計算出來的。(在更高的維度中也存在)。
C.tabulate(n){f} 長度為 n 的集合,其中每個索引值 i 的元素都是透過 f(i) 計算出來的。
C.tabulate(m, n){f} 維度為 m×n 的集合集合,其中每個索引值 (i, j) 的元素都是透過 f(i, j) 計算出來的。(在更高的維度中也存在)。
C.range(start, end) 整數 startend-1 的集合。
C.range(start, end, step) start 開始,並以 step 的增量遞增,直到(不包含)end 值的整數集合。
C.iterate(x, n)(f) 長度為 n 的集合,元素為 xf(x)f(f(x)),…
C.unfold(init)(f) 一個集合,使用函數 finit 狀態開始計算其下一個元素和狀態。

此頁面的貢獻者