[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
List
の使い方を知りたい!
そんな疑問を解消し、Scalaのリストを使えるようになるための記事です。
サンプルコードと出力例を掲載しました。
早速見ていきましょう。
リストの初期化
List
クラスは以下のようにして初期化することができます。
val list = List(1, 2, 3)
追加
リストに追加してみましょう。
val newList = list :+ 4 println(newList)
出力は以下のようになります。
List(1, 2, 3, 4)
結合・連結
リストを結合・連結してみましょう。
val secondList = List(4, 5, 6) val combinedList = list ++ secondList println(combinedList)
出力は以下のようになります。
List(1, 2, 3, 4, 5, 6)
順次処理
リストの各要素を順次処理してみましょう。
副作用を発生させる場合はforeach
メソッド、発生させない場合はmap
メソッドを使います。
def square(n: Int): Int = n * n
list .map(square) .foreach(println)
出力は以下のようになります。
1 4 9
sort
リストをソートして並び替えてみましょう。
val unorderedList = List(2, 3, 1)
val sortedList = unorderedList.sorted println(sortedList)
出力は以下のようになります。
List(1, 2, 3)
sortBy
単純にソートできないオブジェクトであっても、オブジェクトが持っている値のうちどれに基づいて並べ替えればよいかを指定すれば並べ替えることができます。
case class User(id: Int, name: String) val userList = List(User(2, "Sam"), User(3, "Tim"), User(1, "Bob"), User(4, "Ben"))
val sortedUserList = userList.sortBy(_.id) println(sortedUserList)
出力は以下のようになります。
List(User(1,Bob), User(2,Sam), User(3,Tim), User(4,Ben))
sortWith
あるいは並べ替え方を指定することによっても並べ替えることができます。
case class User(id: Int, name: String) val userList = List(User(2, "Sam"), User(3, "Tim"), User(1, "Bob"), User(4, "Ben"))
val sortedUserList = userList.sortWith((l, r) => l.id < r.id) println(sortedUserList)
出力は以下のようになります。
List(User(1,Bob), User(2,Sam), User(3,Tim), User(4,Ben))
よくある失敗パターンを知っておこう!
末尾にアクセスすると遅い
Listは先頭からの片方向のリスト構造として実装されているため、末尾へのアクセスは遅いです。
したがって、末尾に追加したり末尾の要素を取得したりを繰り返すのはできるだけ避けましょう。
回避する方法としては2つ。
- 先頭にアクセスして逆順に並べ替える
- 別の実装(例:
mutable.ListBuffer
)を使う
Listの内部実装の違いで遅い
先頭へのアクセスが多い場合はList
、
ランダムアクセスが多い場合はArraySeq
、
両方ある場合はVector
を使ってみましょう。