在Groovy中将集合拆分为子集合

在Groovy中将集合拆分为子集合,groovy,Groovy,我有一个数组,其中包含未知数量的项,我希望将其拆分为单独的数组,以便每个单独的数组包含的项不超过4项。在Groovy中实现这一点的最佳方法是什么?谢谢 我们这里有: 我想到了这个: List.metaClass.partition = { size -> def rslt = delegate.inject( [ [] ] ) { ret, elem -> ( ret.last() << elem ).size() >= size ? ret <&

我有一个数组,其中包含未知数量的项,我希望将其拆分为单独的数组,以便每个单独的数组包含的项不超过4项。在Groovy中实现这一点的最佳方法是什么?谢谢

我们这里有:

我想到了这个:

List.metaClass.partition = { size ->
  def rslt = delegate.inject( [ [] ] ) { ret, elem ->
    ( ret.last() << elem ).size() >= size ? ret << [] : ret
  }
  !rslt.last() ? rslt[ 0..-2 ] : rslt
}

def list = [1, 2, 3, 4, 5, 6].partition( 4 )
更新!
在Groovy 1.8.6+中,您可以使用
list.collate(4)
获得相同的结果tim_yates的回答很酷,但它在空列表上抛出
java.lang.ArrayIndexOutOfBoundsException
(例如:
[].partition(4)
)。这可以通过以下方式解决:

List.metaClass.partition = {size ->
    if (!delegate)
        return []

    def rslt = delegate.inject([[]]) {ret, elem ->
        (ret.last() << elem).size() >= size ? (ret << []) : ret
    }
    !rslt.last() ? rslt[0..-2] : rslt
}

assert [].partition(4) == []
assert [1, 2, 3, 4, 5, 6].partition(4) == [[1, 2, 3, 4], [5, 6]]
List.metaClass.partition={size->
如果(!委托)
返回[]
def rslt=delegate.inject([[]){ret,elem->

(ret.last()=size?(ret自Groovy 1.8.6以来,您可以使用collate:

def letters = 'a'..'g'
assert letters.collate(3) == [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]

def letters = 'a'..'g'
assert letters.collate(3) == [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]
感谢Mrhaki的Groovy Goods系列:

捕捉得好!还可以将最后一行变成
!rslt[0]?[]:!rslt.last()?rslt[0..-2]:rslt
@Rorick我用一个列表测试了上面的内容,它的工作原理是不改变函数中的任何东西的,Groovy是否平等地对待列表和数组?大多数情况下,这是有区别的。例如,列表没有
length
属性,而数组有。但是在大多数情况下,数组的行为方式与列表相同。从Groovy 1.8.6开始你可以在网上使用Lists@RaffiM使用Groovy 1.8.6+获得相同的结果:-)在大型应用程序中,哪里是定义
分区
方法的最佳位置?使其成为
列表的一部分。元类
不实用,因为它只存在于定义它的groovy类的上下文中。@RaffiM I将升级groovy并使用
校对
;-)如果你在应用程序的启动周期中添加它,或者将它重写为一个类别?我们还没有使用Groovy版本…分区方法可以像实用程序一样独立吗?哪些部分需要更改?@RaffiM还有另一个功能版本
def letters = 'a'..'g'
assert letters.collate(3) == [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]

def letters = 'a'..'g'
assert letters.collate(3) == [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]