以示例:
在java中,我使用for循环遍历集合:
List<Integer> out = new ArrayList<Integer>();
for (int i = 0; i < in.size() - 2; i++)
{
if (in.get(i+1) % 4 == 0) {
out.add(in.get(i) + in.get(i+1) + in.get(i+2)));
i = i + 2;
}
else {
out.add(in.get(i))
}
}
不幸的是,在Scala中,我无法做i = i + 2
,因为循环索引是不可变的。是不是我必须为此目的使用while
循环?或者也许是一些聪明的功能方式?
答案 0 :(得分:3)
就像在Java中一样,你必须迭代每个元素。但是,不是每一步都更新结果对象,而是根据上一步的结果和值返回每个步骤的新对象。
您的帖子中的问题可以通过折叠来解决。您给出一个结果,然后将每个元素应用于该结果以获得最终结果。
val in = List(1,2,3,4,5,6,7,8,9)
in.sliding(3).foldRight(List.empty[Int]){ (row, result) =>
if ((row(0) % 4) == 0) {
result
} else if ((row(1) % 4) == 0) {
(row(0) + row(1) + row(2)) :: result
} else {
row(0) :: result
}
} toList
滑动会在列表上显示“滑动视图”。例如:(1,2,3),(2,3,4),...我在这里使用了foldRight,因为将新元素添加到List的开头而不是结尾更有效。
您也可以自己编写一个递归函数来解决这个问题,它应用了相同的原理。