[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、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"))
list
とlist2
を連結します。
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への末尾追加は遅いです。 末尾に大量に追加するような実装は避けましょう。
先頭に追加して最後に逆転するようにしましょう。