Listへ要素を追加する方法

Scala 3.3.1
最終更新:2023年12月7日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Listに要素を追加する方法について解説します。

サンプルのListはこちらです。

まずユーザー名を表すUser型と、各ユーザーをまとめた変数listを宣言します。

case class User(name: String)
val list: List[User] = List(User("Taro"), User("Jiro"), User("Saburo"))

そして、リストに追加する要素anotherUserを定義します。

val anotherUser = User("Wei")

これらを使って説明していきます。

Listに要素を追加する方法

先頭にひとつだけ要素を追加するには、+: メソッドを使用する

+: メソッドを使用すると、Listの先頭に要素を追加することができます。

以下はlistの先頭にanotherUserを追加した例です。

val listAddHead: List[User] = anotherUser +: list println(listAddHead)

(追加する要素)+:(リスト)という順番で書きます。

メソッドの : が付いている側にリストを置くのがポイントです。

出力は以下のようになります。

List(User(Wei), User(Taro), User(Jiro), User(Saburo))

期待通り、先頭に追加されています。

末尾にひとつだけ要素を追加するには、:+ メソッドを使用する

:+ メソッドを使用すると、Listの先頭ではなく末尾に要素を追加することができます。

以下はlistの末尾にanotherUserを追加した例です。

val listAddEnd: List[User] = list :+ anotherUser println(listAddEnd)

(リスト):+(追加する要素)という順番で書きます。

やはり、メソッドの : が付いている側にリストを置くのがポイントです。

出力は以下のようになります。

List(User(Taro), User(Jiro), User(Saburo), User(Wei))

期待通り、末尾に追加されています。

List型での末尾追加は、後述のパフォーマンス上の理由により、あまり使われません。

Listに要素を追加するには、:: メソッドを使うこともできる

:: メソッドを使うと、Listの先頭に要素を追加することができます。

以下はlistの先頭にanotherUserを連結した例です。

val listLinked: List[User] = anotherUser :: list println(listLinked)

出力は以下のようになります。

List(User(Wei), User(Taro), User(Jiro), User(Saburo))

また、::メソッドを使うと複数の要素を一度に追加することもできます。

以下のように、要素同士を ::で繋げて、末尾にリストを置くことにより、一つのListにまとめ上げることができます。

val anotherUser2 = User("Hoo") val listLinkedMultiple: List[User] = anotherUser :: anotherUser2 :: list println(listLinkedMultiple)

出力は以下のようになります。

List(User(Wei), User(Hoo), User(Taro), User(Jiro), User(Saburo))

List同士の連結処理をするには、::: メソッドを使う

::: メソッドを使うと、List同士を連結することができます。

以下では2つのリストを連結する例を紹介します。

まずは2つ目のリストを定義します。

val list2: List[User] = List(User("John"), User("Michael"), User("Bill"))

listlist2を連結します。

val listAppend: List[User] = list ::: list2 println(listAppend)

出力は以下のようになります。

List(User(Taro), User(Jiro), User(Saburo), User(John), User(Michael), User(Bill))

List以外のリスト構造を持つコレクションクラス

Scalaには List クラス以外にもリスト構造を持つコレクションクラスが用意されています。

必要に応じて使い分けることによって処理効率を最適化することができます。

早速見てみましょう。

Stream

遅延評価を行いたいときに利用します。

Vector

headのみへのアクセスや追加、削除を行うときに利用します。

Stack

LIFO列などを利用するときに利用します。

Queue

FIFO列などを利用するときに使います。

リストに要素を追加する際の注意点

型推論の挙動に注意する

型注釈をしていない定数に型が異なるListを追加したり連結すると、List[Any]になります。

意図したものと異なってしまう場合があるので、必要に応じて型注釈をつけるよう心がけましょう。

Listへの末尾追加は遅い

Listへの末尾追加は遅いです。 末尾に大量に追加するような実装は避けましょう。

  先頭に追加して最後に逆転するようにしましょう。

サイト内検索