あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

リストバッファ

ListBuffer は mutable (変更可能) な List。
頻繁に追加、変更する場合は List だと新規に List を作成し直すため処理効率が
低下するので、そんな場合に ListBuffer を使用します。

ただし Scala は ListBuffer を暗黙には import していないので、使用するときは、scala.collection.mutable.ListBuffer を import しないと使えません。*1

scala> val foo = ListBuffer(1,2,3,4,5)
<console>:7: error: not found: value ListBuffer
       val foo = ListBuffer(1,2,3,4,5)
                 ^

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> val foo = ListBuffer(1,2,3,4,5)
foo: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)

末尾に要素を追加する場合は + で追加。戻り値で追加後の ListBuffer を返します。
戻り値が不要な場合は += で要素を追加します。

scala> foo += 6
res0: foo.type = ListBuffer(1, 2, 3, 4, 5, 6)

要素の参照は List と同じで ListBufferオブジェクトに (..) で添字を指定します。

scala> foo(5)
res1: Int = 6

先頭に要素を追加する場合は +: で右側に追加先のListBufferのオブジェクトを指定し、+: の左側に追加要素を指定します。

scala> 0 +: foo
res2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3, 4, 5, 6)

foo の先頭に要素を追加するには +=: を使用します。

scala> 0 +=: foo
res3: foo.type = ListBuffer(0, 1, 2, 3, 4, 5, 6)

List を末尾に追加する場合は ++= を使用します。

scala> foo ++= List(7,8,9)
res4: foo.type = ListBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

append は += と同じように末尾に要素を追加します。

scala> foo.append(11, 12)

scala> foo.toList
res5: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

prepend は +=: と同じように先頭に要素を追加します。

scala>  foo.prepend(-2, -1)

scala> foo.toList
res6: List[Int] = List(-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

List を先頭に追加する場合は ++=: を使用します。

scala> List(-4, -3) ++=: foo
res7: foo.type = ListBuffer(-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

更新は、更新する添字を foo (..) に指定して = の後に変更する要素を指定します。

scala> foo(0) = 100

scala> foo.toList
res8: List[Int] = List(100, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

ListBuffer へ要素を追加するときは先頭でも末尾でも一定時間で処理してくれます。

*1:たぶん副作用のないプログラミングを推奨しているためでしょう。