在Scala中创建动态增长数组的最佳方法是什么?

Ram*_*Vel 33 scala

我想动态地将项添加到数组中.但是由于不可变的特性,Scala数组和列表似乎没有提供任何动态添加项的方法.

所以我决定使用List数据类型来使用这个::方法来实现这一点.我的代码看起来像这样

var outList = List(Nil)
val strArray = Array("ram","sam","bam")

for (str<-strArray)
     outList = str :: outList
Run Code Online (Sandbox Code Playgroud)

虽然它以某种方式工作,但问题是新的字符串被预先附加到列表中.但理想的要求是数据的顺序.是的,我知道你在想什么,你可以反转最终结果列表以获得原始订单.但问题是它是一个巨大的阵列.我相信它不是一个解决方案,虽然它解决了这个问题.我相信应该有一个简单的方法来解决这个问题......

我破解Scala的原因是学习编码的功能方式.拥有var(可变类型)并在运行中填充列表在我看来并不是解决问题的一种功能性方法.

我该怎么做?

理想情况下,我希望在Scala中实现类似的功能(在C#代码下面)

List<int> ls = new List<int>();    
for (int i = 0; i < 100; i++)
    ls.Add(i);
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 33

但似乎Scala Arrays&Lists没有提供任何动态添加项目的方法,因为它们具有不可变性.

好吧,不.Scala Arrays只是Java数组,因此它们可变的:

val arr = Array(1,2)

arr(0) = 3 // arr == Array(3, 2)
Run Code Online (Sandbox Code Playgroud)

但就像Java(和C/C++/C#/ etc.)数组一样,您无法更改数组的大小.

所以你需要另一个由数组支持的集合,但允许调整大小.Scala中的一个合适的收集是scala.collection.mutable.ArrayBuffer,java.util.ArrayList在Java等

如果你想得到一个List而不是Array最终,请使用scala.collection.mutable.ListBuffer.

  • 谢谢.."ListBuffer"是我想要的.. :) (4认同)

oll*_*erg 5

如果你想使用不可变的结构,你可以使用 ++ 方法:

scala> val orgList = List(1,2,3)
orgList: List[Int] = List(1, 2, 3)

scala> val list2Add = List(4,5,6)
list2Add: List[Int] = List(4, 5, 6)

scala> val newList = orgList ++ list2Add
newList: List[Int] = List(1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)

如果您想对元素做更多的工作而不仅仅是添加它们,您可以使用高阶函数:

val newList = orgList ++ list2Add.map(_ * 2)
newList: List[Int] = List(1, 2, 3, 8, 10, 12)
Run Code Online (Sandbox Code Playgroud)

或者使用 for 循环:

val newList = orgList ++ {for(x <- list2Add) yield 2*x}
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一些递归循环:

def addAll(toList: List[Int], fromList: List[Int]): List[Int] =
  fromList match {
    case x :: tail => addAll(2*x :: toList, tail)
    case Nil => toList
  }

val newList = addAll(orgList, list2Add )
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,添加元素的顺序将相反:

List(12, 10, 8, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果您希望在使用列表时获得性能,最好反转结果,而不是尝试在最后添加新元素。在列表末尾添加元素是没有好处的:-)