如何使用特定分组条件对集合元素进行分组?

时间:2013-09-14 17:24:01

标签: scala collections

以示例:

  • 列表=(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循环?或者也许是一些聪明的功能方式?

1 个答案:

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

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