コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

Scalaで配列/リストを操作するSeqコレクションについてまとめた

Scalaで配列またはリストを使う際はSeqがおすすめです。本記事では、他のプログラミング言語における配列やリストとは少し異なる挙動を示すSeqコレクションの文法および操作についてまとめました。

Seqの宣言

ScalaのSeqは以下のように作ることができます。

scala> Seq("One", "Two", "Three")
res0: Seq[String] = List(One, Two, Three)


変数seqにリストを持たせる場合は以下のように宣言することができます

scala> val seq: Seq[String] = Seq("One", "Two", "Three")
seq: Seq[String] = List(One, Two, Three)


Seqの要素についてString型をあらかじめ宣言する必要がある点が、Pythonなどのスクリプト言語との大きな違いです。

Seqの要素にアクセスする

ScalaでSeqの要素にアクセスする方法について紹介します。

次のように添字1を指定して要素を取り出すことができます。

scala> seq(1)
res1: String = Two


Scalaの添字は他の多くのプログラミング言語と同じく0で始まるため、2番目の要素が抽出されていることがわかります。

また、Seqの先頭要素や末尾要素へのアクセスはheadやlastを使って次のように行うことができます。

scala> seq.head
res2: String = One

scala> seq.last
res3: String = Three


Seqのinitやtailを使うと、次のように末尾以外・先頭以外の要素を取り出すことができます。

scala> seq.init
res4: Seq[String] = List(Two, Three)

scala> seq.tail
res5: Seq[String] = List(One, Two)

Seqの要素を追加または削除する

ScalaでSeqに要素を追加または削除する方法について紹介します。

先頭に要素を追加するには+: 、末尾に追加するには :+ と記述します。

scala> "Zero" +: seq
res6: Seq[String] = List(Zero, One, Two, Three)

scala> seq +: "Four"
res7: Seq[String] = List(One, Two, Three, Four)


このとき、元のseqは変化していないことに気づかれた方もいると思います。Scalaのコレクションは基本的に非破壊的であるため、新しいオブジェクトが返されるということを覚えておきましょう。

複数のSeqを連結する

Scalaで複数のSeqを結合する方法は次の通りです。

scala> val seqToAdd = Seq("Hello", "World")
seqToAdd: Seq[String] = List(Hello, World)

scala> seq ++ seqToAdd
res8: Seq[String] = List(One, Two, Three, Hello, World)


Seq同士が連結されていることが確認できます。

Seqの要素をソートする

ScalaでSeqをソートするにはsortedを使います。また、逆順に表示するにはreverseを使います。この辺りはpythonと同じメソッド名ですね。

scala> Seq(8, 3, 4, 1).sorted
res9: Seq[Int] = List(1, 3, 4, 8)

scala> Seq(8, 3, 4, 1).reverse
res10: Seq[Int] = List(1, 4, 3, 8)

まとめ

ScalaのSeqコレクションの文法および操作についてまとめました。本記事で取り上げた内容はかなり基本的なメソッドばかりですが、Scalaのリスト操作にはmap, filter, foldLeft, foldRight などの特徴的なメソッドがまだまだあります。これらについては別記事で紹介できればと思います。