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

时间:2010-06-30 08:22:36

标签: groovy

我有一个包含未知数量项目的数组,我想将其拆分为单独的数组,以便每个单独的数组包含不超过4个项目。在Groovy中执行此操作的最佳方法是什么?谢谢!

3 个答案:

答案 0 :(得分:9)

我们在这里有:How to split a list into equal sized lists in 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 )

哪个应该给你:

[ [ 1, 2, 3, 4 ], [ 5, 6 ] ]

更新!

使用Groovy 1.8.6+,您可以使用list.collate( 4 )获得相同的结果

答案 1 :(得分:6)

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]]

答案 2 :(得分:4)

从Groovy 1.8.6开始,你可以使用collat​​e:

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善良系列: http://mrhaki.blogspot.com.au/2012/04/groovy-goodness-collate-list-into-sub.html