У меня есть массив, содержащий неизвестное количество элементов, которые я хотел бы разбить на отдельные массивы, чтобы каждый отдельный массив содержал не более 4 элементов. Как лучше всего это сделать в Groovy? Спасибо!
Вопрос
Разделить коллекцию на подколлекции в Groovy
- Начиная с groovy 1.8.6 вы можете использовать метод сортировки в списках. tim_yates 10.02.2012
Ответы
Ответ 1 · рейтинг 9 · tim_yates
У нас было это здесь: Как разделить список в списки одинакового размера в 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 ) для получения того же результата.
Ответ 2 · рейтинг 6 · Rorick
Ответ 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]]
Ответ 3 · рейтинг 4 · Armin
Начиная с Groovy 1.8.6, вы можете использовать подборку:
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']]
Кредит на серию Groovy Goodness от Mrhaki: http://mrhaki.blogspot.com.au/2012/04/groovy-goodness-collate-list-into-sub.html
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.