有多种方法可以在Scala中构造不可变列表(请参见下面的伪造示例代码)。您可以使用可变的ListBuffer,创建var列表并进行修改,使用tail recursive方法以及其他我不知道的方法。

本能地,我使用ListBuffer,但是我没有充分的理由这样做。是否有一种首选的或惯用的方法来创建列表,或者是否存在最适合一种方法而不是另一种方法的情况?

import scala.collection.mutable.ListBuffer

// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
    var list:List[Int] = Nil

    for(i <- 0 to 3)
        list = list ::: List(i)
    list
}


def listTestB() ={
    val list = new ListBuffer[Int]()

    for (i <- 0 to 3)
        list += i
    list.toList
}


def listTestC() ={
    def _add(l:List[Int], i:Int):List[Int] = i match {
        case 3 => l ::: List(3)
        case _ => _add(l ::: List(i), i +1)
    }
    _add(Nil, 0)
}

最佳答案

ListBuffer是一个可变列表,具有固定时间追加,并且可以将恒定时间转换为List
List是不可变的,并且具有固定时间的前置和线性时间的附加。

构造列表的方式取决于使用列表的算法以及获取元素创建列表的顺序。

例如,如果您获得的元素使用时的顺序相反,则只需使用List并进行前置即可。是否使用尾部递归函数foldLeft或其他方法都无关紧要。

如果以与您使用它们相同的顺序获得元素,那么如果性能至关重要,则ListBuffer最有可能是首选。

但是,如果您不在关键路径上并且输入足够低,则始终可以稍后用reverse列表,或者仅输入foldRightreverse输入,这是线性时间。

不要做什么就是使用List并将其附加到它后面。这将使您的性能远不止最后添加和反转。

关于scala - 创建Scala列表的首选方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1241166/

10-11 23:11
查看更多