KZKY memo

自分用メモ.

Scala Listの落とし穴

ScalaでハマったCollectionの話.

ScalaのCollectionは基本的にImmutableなのでCollectionに新しい値を追加するときは,
追加したい要素が追加された新しい(newされた)Collectionインスタンスが返ってくると考えたほうがいい.

さらに,ScalaのListは一方方向リストでポンタは常に先頭を指しているようなので,末尾に要素を追加すると非常に遅い.

Listに要素を追加する際に,+:=で,先頭に要素を追加するサンプルコード.

package edu.kzk.scala_sample.basic.collection

import scala.util.Random

object ListSample {

    def main(args: Array[String]) {
        
        // List生成
        val l = List("a", "b", "c");
        println("List", l);
        
        // 要素の追加
        var list = List[Int]();
        //var list = MutableList[Int](); // mutableだとaddした時に,newして返すので遅い
        //var list = LinkedList[Int](); // _.mutable.LinkedListは+:=が見つからなかったが遅い.
        //var list = ListBuffer[Int](); // ListBufferもaddでnewしているので遅い.
        Random.setSeed(10L);
        var stime = System.currentTimeMillis();
        for(a <- Range(0, 30000)) {
            // 先頭に追加していったほうが確実に早い
            //list = Random.nextInt(10) +: list; 
          list +:= Random.nextInt(10); 
            if (a % 10000 == 0)
                println(a);
        }
        println(list.size);
        var etime = System.currentTimeMillis();
        printf("total time: %d [s]\n", (etime - stime)/1000);
        println(list.take(100));

    }
}