Split collection into sub collections in Groovy

前端 未结 3 1805
轮回少年
轮回少年 2021-01-14 05:34

I have an array containing an unknown number of items that I would like to split into separate arrays so that each separate array contains no more than 4 items. What is the

相关标签:
3条回答
  • 2021-01-14 06:07

    Answer by tim_yates is cool, but it throws java.lang.ArrayIndexOutOfBoundsException on empty lists (for example: [].partition(4)). This can be fixed in this way:

    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]]
    
    0 讨论(0)
  • 2021-01-14 06:15

    We had this here: How to split a list into equal sized lists in Groovy?

    I came up with this:

    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 )
    

    Which should give you:

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

    Update!

    With Groovy 1.8.6+ you can use list.collate( 4 ) to get the same result

    0 讨论(0)
  • 2021-01-14 06:24

    Since Groovy 1.8.6, you can use 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']]
    

    Credit to Mrhaki's Groovy goodness series: http://mrhaki.blogspot.com.au/2012/04/groovy-goodness-collate-list-into-sub.html

    0 讨论(0)
提交回复
热议问题