我需要从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
}
针对该问题是否还有更多功能性或常规解决方案?
答案 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
。