【发布时间】:2014-05-10 12:15:59
【问题描述】:
在我正在学习的书中有一个练习:
编写一个循环,交换整数数组的相邻元素。例如,
Array(1,2,3,4,5)变为Array(2,1,4,3,5)。我的解决方案是:
var v = Array(0,1,2,3,4,5,6,7,8,9)
for (i <- 0 until v.length by 2) {
var temp = 0
temp = v(i+1); v(i+1) = v(i); v(i) = temp
}
这个算法运行良好,但没有充分利用 Scala 的潜力,它的编写就像我用 C++ 编写的一样。事实上,下面的练习要求:
重复前面的赋值,但是用交换后的值生成一个新数组。使用 for/yield。
现在我尝试了:
val a = ArrayBuffer(1,2,3,4,5)
var res = for (i <- 0 until a.length by 2) yield a(i)
for (i <- 1 until a.length by 2) res(i-1)=a(i) <---------eclipse give me an error
错误是:“value update is not a member of scala.collection.immutable.IndexedSeq[Int]”
我该如何解决这个任务?我知道“for/yield”这个语法很强大,但是不知道怎么用。
【问题讨论】:
-
这个错误是因为
res是一个不可变的序列(一个向量),不能就地更新。 Vector 确实有一个updated(index: Int, elem: A)方法,但是,它返回一个带有更新元素的新 Vector。 -
a 是一个 ArrayBuffer,所以 res 也会自动成为一个 ArrayBuffer。对吗?
-
不,它没有 - 试试看!如果您执行
for (i <- a) yield i之类的操作,它将变为ArrayBuffer,其中a是for-comprehension 中的起始集合。