除法算法: a)部分 x 人应该分为几类。 b部分)每个小组的人数(人数)应尽可能接近 y 。
要使a和b都成功,最优雅的解决方案是什么?
package stackoverflow
fun main(args : Array<String>) {
class Person
class Group(val people:List<Person>)
// x=22 and y=6 should produce following groups 6,6,5,5.
// By using kotlin's Collections.chunked function I can put people into groups.
val x = 22
val y = 6
val people = (1..x).map { Person() }
val groups = people.chunked(y).map { peopleList -> Group(peopleList) }
// part a succeed
assert(groups.size == 4)
// part b fails
groups.forEach { print(" "+it.people.size) } // 6 6 6 4
}
答案 0 :(得分:1)
我可以想到一种算法,首先计算组数,然后将第一个元素放入第一组,将第二个元素放入第二组,依此类推,因此第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]]