0

举例:

  • 对于列表 = (1,2,3,4,5,6,7,8,9)
  • 我想根据以下条件对该列表的元素进行分组:
  • 如果 x 能被 4 整除,则将其与相邻元素相加
  • 预期结果 = (1, 2, 12, 6, 23)

在 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为此目的使用循环?或者也许是一些聪明的功能方式?

4

1 回答 1

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 的开头而不是末尾更有效。

你也可以自己编写一个递归函数来解决这个问题,它应用了相同的原理。

于 2013-09-14T18:45:04.487 回答