从Groovy中的列表中提取对

时间:2016-09-13 13:51:15

标签: groovy

我需要从Groovy中的列表中提取周围元素对,以便断言通过:

assert pairs([1, 2, 3, 4]) == [[1, 2], [2, 3], [3, 4]]

def pairs(List list) {
  //...
}

我目前的实施如下:

def pairs(List list) {
    def result = []
    for (int i = 0; i < list.size() - 1; i++) {
        result += [[list[i], list[i + 1]]]
    }
    result
}

针对该问题是否还有更多功能性或常规解决方案?

3 个答案:

答案 0 :(得分:5)

只是做:

def pairs(List list) {
    list.collate(2, 1, false)
}

这意味着“将它们分组为2组,每次沿输入列表1条目滑动,并删除任何小于2的组” 并且您将获得预期的结果......无需删除或合并或添加

答案 1 :(得分:3)

请参阅collate

groovy:000> [1,2].collate(2,1)[0 .. -2]
===> [[1, 2]]
groovy:000> [1,2,3].collate(2,1)[0 .. -2]
===> [[1, 2], [2, 3]]
groovy:000> [1,2,3,4].collate(2,1)[0 .. -2]
===> [[1, 2], [2, 3], [3, 4]]
groovy:000> [1,2,3,4,5].collate(2,1)[0 .. -2]
===> [[1, 2], [2, 3], [3, 4], [4, 5]]

使用dropRight(1)可能会更清楚一些(cfrick的建议):

groovy:000> [1,2,3,4].collate(2,1).dropRight(1)
===> [[1, 2], [2, 3], [3, 4]]

Duh,没有看到keepRemainder参数的重载。 Thanks, Tim

  

如果keepRemainder为false,则将删除细分后iterable中的任何剩余元素

groovy:000> [1,2,3,4].collate(2, 1, false)
===> [[1, 2], [2, 3], [3, 4]]

答案 2 :(得分:1)

也许是这样的?

def pairs(list){
    def evenPairs = input.collate(2)
    def oddPairs = input.drop(1).collate(2, false)
    (evenPairs + oddPairs​)​.sort()​
}

如果它是一种交替合并数组的方式(或者命令并不重要),那么它就不需要那种丑陋的sort