Я могу придумать алгоритм, в котором вы сначала рассчитываете количество групп, затем помещаете первый элемент в первую группу, второй элемент во вторую группу и т. Д., Так что n-й элемент переходит в n mod groupCount
группы.Таким образом, группы заполняются как можно более равномерно.
val items = (1..22).toList()
val maxGroupSize = 6
val groups = (items.size + maxGroupSize - 1) / maxGroupSize
// imperative approach
val result = List(groups) { mutableListOf<Int>() }
items.forEachIndexed { index, item -> result[index % groups].add(item) }
println(result)
Вы можете сделать то же самое по-другому с помощью функции groupBy
:
// functional approach
val result = items.withIndex().groupBy({ it.index % groups }, { it.value }).values
println(result)
В обоих случаях выдается следующий результат:
[[1, 5, 9, 13, 17, 21], [2, 6, 10, 14, 18, 22], [3, 7, 11, 15, 19], [4, 8, 12, 16, 20]]