在Scala中更新ArrayBuffer的现有String元素

时间:2015-07-27 19:37:39

标签: scala

我有ArrayBuffer Strings如下:

var myList = ArrayBuffer[String]()
myList += "abc"
myList += "def"

现在,我尝试根据某些条件更新String中的ArrayBuffer

for(item <- myList){
  if(some condition){
    item = "updatedstring"
  }
}

当我尝试这样做时,我收到错误消息,指出val无法重新分配。即使我已将myList声明为var,为什么会出现此错误?如果我无法以这种方式更新它,那么在迭代ArrayBuffer时我还能如何更新元素?我是Scala的新手,所以如果我弄错了,我会道歉。

2 个答案:

答案 0 :(得分:1)

我要指出的第一件事是itemmyList不一样 - 它是myList中的元素,以及Scala迭代的工作方式,它是val。有很多原因导致这种不可变性,我不会进入这里。

我建议改为:

val myNewList = myList.map(originalString =>
    if (someCondition) "xyz"
    else originalString
)

然后,如果你有这种倾向,你可以做myList = myNewList(或者只是放弃完全myNewList并做myList = myList.map(...))。

答案 1 :(得分:0)

在for循环item中是本地val。因此,它无法改变。 你可以:

遍历数组并更新每个项目

myList.zipWithIndex foreach { case (item, index) if (condition) => myList.update(index, "updated") }

或创建新的ArrayBuffer

myList = (0 until myList.length).map { index => 
  val item = myList(index)
  if (condition) "updated" else item
}