Как разделить людей на группы? - PullRequest
0 голосов
/ 26 сентября 2018

Алгоритм деления: Часть а) х люди должны быть разделены на группы.Часть б) Размер каждой группы (количество человек) должен быть как можно ближе к 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 голосов
/ 28 сентября 2018

Я могу придумать алгоритм, в котором вы сначала рассчитываете количество групп, затем помещаете первый элемент в первую группу, второй элемент во вторую группу и т. Д., Так что 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...