我想动态地将项添加到数组中.但是由于不可变的特性,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.
如果你想使用不可变的结构,你可以使用 ++ 方法:
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)
如果您希望在使用列表时获得性能,最好反转结果,而不是尝试在最后添加新元素。在列表末尾添加元素是没有好处的:-)
| 归档时间: |
|
| 查看次数: |
33186 次 |
| 最近记录: |