题 Scala更新数组元素


我从没想过我会问这么简单的问题但是如何在scala中更新数组元素

我在我的Main对象中声明了内部函数,我有这样的东西

object Main
{
    def main(args: Array[String])
    {
        def miniFunc(num: Int)
        {
            val myArray = Array[Double](num)
            for(i <- /* something*/)
                myArray(i) = //something
        }
    }
}

但我总是得到一个例外,有人可以解释我为什么以及如何解决这个问题?


11
2018-02-21 20:40


起源


令我困惑的是,当Scala中的数组和其他集合被认为是不可变的时,人们会认为更新数组元素是不可能的(例如在Scala Saddle中),但它实际上意味着一旦创建为尺寸不能改变,但内容是...... - SkyWalker
许多集合在Scala中是不可变的,但Arrays只是Java Arrays,它们是可变的。 - Ben Horner


答案:


你能填写遗漏的细节吗?例如,评论的位置是什么?有什么例外? (最好用完整的代码示例提出问题并明确说明 什么 问题是。)

这是一个数组构造和更新的例子:

scala> val num: Int = 2
num: Int = 2

scala> val myArray = Array[Double](num)
myArray: Array[Double] = Array(2.0)

scala> myArray(0) = 4

scala> myArray
res6: Array[Double] = Array(4.0)

也许你正在做出这样的假设 num 代表你的数组的大小?实际上,它只是数组中的(唯一)元素。也许你想要这样的东西:

    def miniFunc(num: Int) {
        val myArray = Array.fill(num)(0.0)
        for(i <- 0 until num)
            myArray(i) = i * 2
    }

14
2018-02-21 20:51



是的,我以为num表示数组的大小,谢谢 - user1224307
@ user1224307它只代表你使用的大小 new 关键词。 Array(1, 2, 3) 只是一个包含元素1,2和3的数组。 - Daniel C. Sobral
值得指出你可以用Array.tabulate初始化数组,例如Array.tabulate(10)(identity)给出Array [Int](0,1,2,3,4,5,6,7,8,9) )和Array.tabulate(10)(_ * 2)给出Array [Int](0,2,4,6,8,10,12,14,16,18) - Jed Wesley-Smith