Collections

コレクションの作成

Language

List(1, 2, 3) 構文によって 3つの整数から成るリストを作成でき、Map('A' -> 1, 'C' -> 2) 構文によって 2つの写像から成るマップを作成することができる。これは Scala コレクションの統一された機能だ。どのコレクションを取っても、その名前に括弧付けされた要素のリストを付け加えることができる。結果は渡された要素から成る新しいコレクションだ。以下に具体例で説明する:

Traversable()             // 空の traversable オブジェクト
List()                    // 空のリスト
List(1.0, 2.0)            // 要素 1.0, 2.0 を含むリスト
Vector(1.0, 2.0)          // 要素 1.0, 2.0 を含むベクトル
Iterator(1, 2, 3)         // 3つの整数を返すイテレータ
Set(dog, cat, bird)       // 3種類の動物の集合
HashSet(dog, cat, bird)   // 同じ動物のハッシュ集合
Map('a' -> 7, 'b' -> 0)   // 文字から整数へのマップ

上の全ての行での呼び出しは内部では何らかのオブジェクトの apply メソッドを呼び出している。例えば、3行目は以下のように展開する:

List.apply(1.0, 2.0)

つまり、これは List クラスのコンパニオンオブジェクトの apply メソッドを呼び出している。このメソッドは任意の数の引数を取り、それを使ってリストを構築する。Scala ライブラリの全てのコレクションクラスには、コンパニオンオブジェクトがあり、そのような apply メソッドを定義する。コレクションクラスが ListStream、や Vector のような具象実装を表しているのか、SeqSet、や Traversable のような抽象基底クラスを表しているのかは関係ない。後者の場合は、apply の呼び出しは抽象基底クラスの何らかのデフォルト実装を作成するだけのことだ。用例:

scala> List(1, 2, 3)
res17: List[Int] = List(1, 2, 3)
scala> Traversable(1, 2, 3)
res18: Traversable[Int] = List(1, 2, 3)
scala> mutable.Traversable(1, 2, 3)
res19: scala.collection.mutable.Traversable[Int] = ArrayBuffer(1, 2, 3)

apply とは別に、全てのコレクションのコンパニオンオブジェクトは、空のコレクションを返す empty を定義する。よって、List() の代わりに List.empty と書いたり、Map() の代わりに Map.empty と書くことができる。

Seq を継承するクラスは、コンパニオンオブジェクトにおいて他の factory 演算を提供する。以下の表にこれらの演算をまとめた。要約すると、

  • concat は任意の数の traversable を連結する。
  • filltabulate は単次元か任意の多次元の列を生成して、なんらかの式かテーブル化関数によりその列を初期化する。
  • range は一定のステップ値で整数の列を生成する。
  • iterate は開始要素に連続して関数を適用することによって得られる列を生成する。

列の factory 演算

使用例 振る舞い
S.empty 空の列。
S(x, y, z) 要素 x, y, z からなる列。
S.concat(xs, ys, zs) xs, ys, zs の要素を連結することによって得られる列。
S.fill(n){e} 全ての要素が式 e によって計算された長さ n の列。
S.fill(m, n){e} 全ての要素が式 e によって計算された m × n の大きさの列の列。(より高次元なものもある)
S.tabulate(n){f} 添字 i の位置の要素が f(i) によって計算された長さ n の列。
S.tabulate(m, n){f} 添字 (i, j) の位置の要素が f(i, j) によって計算された m×n の大きさの列の列。(より高次元なものもある)
S.range(start, end) startend-1 の整数の列。
S.range(start, end, step) start より始まり end 未満まで step づつ増加する整数の列。
S.iterate(x, n)(f) 要素 xf(x)f(f(x))、… からなる長さ n の列。