向scala中的数组添加值

Adding value to arrays in scala

我遇到了一个问题,我需要在 Array 的中间添加一个新值(即复制原始数组并将其替换为新数组)。我成功解决了我的问题,但我想知道是否有其他方法可以在不更改数组缓冲一段时间的情况下执行此操作。

val original = Array(0, 1, 3, 4)
val parts = original.splitAt(2)
val modified = parts._1 ++ (2 +: parts._2)

res0: Array[Int] = Array(0, 1, 2, 3, 4)

我不喜欢我的解决方案的地方是 parts 变量;我不想使用那样的中间步骤。这是添加值的最简单方法还是有一些更好的方法来添加元素?

您可以使用 mutable version of a collection 来做到这一点。方法 insert 做你想做的(在给定索引处插入一个元素)。

好吧,如果额外的变量确实是困扰您的问题,您可以一次性完成:

val modified = original.take(2) ++ (2 +: original.drop(2))

但是根据您的用例(例如性能、数组大小、多次此类编辑...),建议使用像 Augusto 这样的可变集合可能更适合。

问题是,上下文是什么?如果您在循环中执行此操作,则每次分配一个新数组无论如何都会降低您的性能,您应该重新考虑您的方法(例如,在插入之前收集所有要插入的元素)。

如果不是,那么,您可以使用 System.arraycopy 来避免任何中间转换:

val original = Array(0, 1, 3, 4)
val index = 2
val valueToInsert = 2

val modified = Array.ofDim[Int](original.length + 1)
System.arraycopy(original, 0, modified, 0, index)
modified(index) = valueToInsert
System.arraycopy(original, index, modified, index + 1, original.length - index)

但请注意,这里很容易出现差一错误(我认为没有,但我还没有测试过)。所以这样做的唯一原因是如果你真的需要高性能,而且只有在循环中发生才可能,在这种情况下回到第二句话。

这正是 patch 所做的:

val original = Array(0, 1, 3, 4)
original.patch(2, Array(2), 0)      // Array[Int] = Array(0, 1, 2, 3, 4)