更新Scala中ArrayBuffer的现有字符串元素
我有一个更新Scala中ArrayBuffer的现有字符串元素,scala,Scala,我有一个ArrayBuffer的Strings,如下所示: var myList = ArrayBuffer[String]() myList += "abc" myList += "def" 现在,我正试图根据某些条件更新ArrayBuffer中的字符串: for(item <- myList){ if(some condition){ item = "updatedstring" } } 对于(item我要指出的第一件事是,item与myList不同-它是myLis
ArrayBuffer
的Strings
,如下所示:
var myList = ArrayBuffer[String]()
myList += "abc"
myList += "def"
现在,我正试图根据某些条件更新ArrayBuffer
中的字符串
:
for(item <- myList){
if(some condition){
item = "updatedstring"
}
}
对于(item我要指出的第一件事是,item
与myList
不同-它是myList
中的一个元素,Scala迭代的工作方式是val
。这与不变性相关的原因有很多,我在这里不作详细介绍
我建议改为:
val myNewList = myList.map(originalString =>
if (someCondition) "xyz"
else originalString
)
然后,如果您愿意,您可以执行myList=myNewList
(或者完全放弃使用myNewList
,执行myList=myList.map(…)
)。for循环中的项是本地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
}
您可以在上一个解决方案中使用myList.index
,它返回的范围与(0到myList.length)
相同。