首页 > 解决方案 > 如何使用 Scala 更新不可变数组中的特定元素

问题描述

我在 scala 中有不可变数组,如下所示:

val myArray = Array.fill(3)(null)

所以我想要的是更新数组中的某个位置。比如第二个位置。我试过这种方式,但它总是只返回一个值的数组

myArray(0) = "2"

myArray(1) = "3"

由于某些原因,它只返回第一个元素 "2" 。

标签: scala

解决方案


Scala 中的数组是可变的。

val myArray = Array.fill[String](3)(null)
// myArray is Array(null, null, null)

myArray(1) = "1"

// myArray is now Array(null, 1, null)

如果您想要一个不可变的替代品Array,请查看Vector

val myVec = Vector.fill[String](3)(null)
// myVec is Vector(null, null, null)

myVec.updated(1, "1")  // returns NEW Vector(null, 1, null)

// here myVec is still Vector(null, null, null)

请注意,更新Vector比改变 更慢Array,这是不变性的代价。


另一种选择是ArraySeq在(scala 2.13)中使用不可变:

val myArrSeq = ArraySeq.fill[String](3)(null)
// myArrSeq is ArraySeq(null, null, null)

myArrSeq.updated(1, "1")  // returns NEW ArraySeq(null, 1, null)

// myArrSeq is still ArraySeq(null, null, null)

它的行为方式与 Vector 相同,并且在内部由普通数组支持,但是(重要!)每次更新都会复制整个序列( O(N) ),这在大多数情况下是不可接受的。


另外,检查这个相关问题


推荐阅读