gpt4 book ai didi

scala - 创建 Scala 列表的首选方式

转载 作者:行者123 更新时间:2023-12-03 04:38:20 24 4
gpt4 key购买 nike

在 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稍后列出,或者只是 foldRight ,或reverse输入,是线性时间的。

做的是使用 List并附加到它后面。与仅在末尾添加和反转相比,这会给您带来更差的性能。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com