列トレイトSeq, IndexedSeq, およびLinearSeq | 目次 |
Seqトレイトは列を表します。 列はlengthを持ち、各要素が0から始まる固定された添字位置を持つイテラブルです。
列に対する演算は以下の図に要約でき、以下のカテゴリに分類できます:
もし列が変更可能であれば、追加で副作用のあるupdateメソッドを提供します。 通常のScalaのようにseq(idx) = elemという構文はseq.update(idx, elem)の略であり、updateは便利な代入構文をタダで与えます。 updateとupdatedの違いに注意してください。 updateは列の要素を直接変更しますが、updatedは全ての列で利用可能で、元の列を変更する代わりに常に新しい列を返します。
何であるか | 何をするか |
---|---|
添字付けと長さ: | |
xs(i) | (または書き下してxs apply i)。xsのiにある要素。 |
xs isDefinedAt i | iがxs.indicesに含まれるか調べる。 |
xs.length | 列の長さ(sizeと同じ)。 |
xs.lengthCompare ys | xsがysより短かければ-1を返し、長ければ+1を返し、同じ長さを持てば0を返す。 片方の列が無限でも動作する。 |
xs.indices | xsの添字範囲で、0からxs.length - 1まで。 |
添字検索: | |
xs indexOf x | xと等しいxs内の最初の要素の添字(いくつか変種がある)。 |
xs lastIndexOf x | xと等しいxs内の最後の要素の添字(いくつか変種がある)。 |
xs indexOfSlice ys | その添字から始まる要素がysとなるようなxsの最初の添字。 |
xs lastIndexOfSlice ys | その添字から始まる要素がysとなるようなxsの最後の添字。 |
xs indexWhere p | xs内で最初にpを満たす要素の添字(いくか変種がある)。 |
xs segmentLength (p, i) | xs内の要素で、全てが途切れ無く述語pを満たすようなxs(i)から始まる最も長い区間の長さ。 |
xs prefixLength p | xs内の要素で、全てが述語pを満たすような最も長いプレフィックスの長さ。 |
追加: | |
x +: xs | xをxsの最初に追加してできた新しい列。 |
xs :+ x | xをxsの最後に追加してできた新しい列。 |
xs padTo (len, x) | 長さがlenになるまでxsに値xを最後に追加してできる列。 |
更新: | |
xs patch (i, ys, r) | xsのiから始まるr要素をパッチysで置き替えてできる列。 |
xs updated (i, x) | 添字iにある要素をxで置き替えたxsのコピー。 |
xs(i) = x | (または書き下してxs.update(i, x)、mutable.Seqにのみ存在) xsの添字iにある要素をyに変更する。 |
整列: | |
xs.sorted | xsの要素型の標準的な順序付けでxsの要素を整列して得られる新しい列。 |
xs sortWith lt | ltを順序付け演算としてxsの要素を整列して得られる新しい列。 |
xs sortBy f | xsの要素を整列して得られる新しい列。 2要素の比較はまず関数fで両者を写してその結果を比較する。 |
反転: | |
xs.reverse | xsの要素を逆順で持つ列。 |
xs.reverseIterator | 全てのxs内の要素を逆順で返すイテレータ。 |
xs reverseMap f | fをxsの要素に逆順に適用して得られる列。 |
比較: | |
xs startsWith ys | xsが列ysで始まるか調べる(いくつか変種がある)。 |
xs endsWith ys | xsが列ysで終わるか調べる(いくつか変種がある)。 |
xs contains x | xsがxと等しい要素を含むか調べる。 |
xs containsSlice ys | xsが列ysと等しい連続な部分列を持つか調べる。 |
(xs corresponds ys)(p) | xsとysの対応する要素が二項述語pを満たすか調べる。 |
多重集合演算: | |
xs intersect ys | xsとysの多重集合積で、xsの要素の順序を保存する。 |
xs diff ys | xsとysの多重集合差で、xsの要素の順序を保存する。 |
xs union ys | 多重集合和。xs ++ ysと同じ。 |
xs.distinct | 重複する要素を含まないxsの部分列。 |
Seqトレイトは2つの子トレイトLinearSeq, およびIndexedSeqを備えます。 両者は新しい演算を追加しませんが、それぞれ異なる効率特性を示します: 線形列(LinearSeq)は効率の良いheadとtail演算を備えている一方、 添字付き列(IndexedSeq)は効率の良いapply, length, および(可変であれば)update演算を備えています。 よく使われる線形列はscala.collection.immutable.Listとscala.collection.immutable.Streamです。 よく使われる添字付き列はscala.Arrayとscala.collection.mutable.ArrayBufferです。 Vectorクラスは添字付きと線形アクセスの興味深い折衷案を提供します。 実質的に定数時間の添字付けのオーバーヘッドと、定数時間の線形アクセスのオーバーヘッドを持ちます。 この性質により、ベクタ(Vector)は添字付きと線形アクセスの両方が使われるような、混合したアクセスパターンのためのよい基盤となります。 ベクタについては他のところで学びます。
続いては:
列トレイトSeq, IndexedSeq, およびLinearSeq | 目次 |