Разделить список на части

Есть ли простой способ разделить список на части (возможно, лямбда) в Котлин?

Например:

[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]

Ответы

Ответ 1

Учитывая список: val list = listOf(1, 2, 3, 4, 5, 6) вы можете использовать groupBy:

list.groupBy { (it + 1) / 2 }.map { it.value }

Или, если ваши значения не являются номерами, вы можете сначала присвоить им индекс:

list.withIndex()
    .groupBy { it.index / 2 }
    .map { it.value.map { it.value } }

Или, если вы хотите сохранить некоторые распределения, вы можете пойти немного более вручную с помощью foldIndexed:

list.foldIndexed(ArrayList<ArrayList<Int>>(list.size / 2)) { index, acc, item ->
    if (index % 2 == 0) {
        acc.add(ArrayList(2))
    }
    acc.last().add(item)
    acc
}

Ответ 3

Лучший ответ на самом деле тот, который был создан VasyaFromRussia.

Если вы используете groupBy, вам нужно будет добавить и индексировать, а затем IndexedValue пост-обработку, извлекая значение из объекта IndexedValue.

Если вы используете chunked, вам просто нужно написать:

val list = listOf(10, 2, 3, 4, 5, 6)
val chunked = list.chunked(2)
println(chunked)

Это печатает:

[[10, 2], [3, 4], [5, 6]]

Ответ 5

Хороший способ разделения списка - использование функции partition. В отличие от groupBy он не делит список по ключам, а скорее по предикату, который в результате выдает Pair<List, List>.

Вот пример:

val (favorited, rest) = posts.partition { post ->
    post.isFavorited()
}
favoritedList.addAll(favorited)
postsList.addAll(rest)