如何将人们分为几类?

时间:2018-09-26 20:32:15

标签: kotlin

除法算法: 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
}

1 个答案:

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