Разделить список на части
Есть ли простой способ разделить список на части (возможно, лямбда) в Котлин?
Например:
[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
}
Ответ 2
Начиная с Kotlin 1.2 вы можете использовать Iterable<T>.chunked(size: Int): List<List<T>>
function из stdlib (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html).
Ответ 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]]
Ответ 4
API говорит, что есть функция GroupBy, которая должна делать то, что вы хотите.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html
Или используйте подсписку и разбейте себя
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections / -list/sub-list.html
Ответ 5
Хороший способ разделения списка - использование функции partition
. В отличие от groupBy
он не делит список по ключам, а скорее по предикату, который в результате выдает Pair<List, List>
.
Вот пример:
val (favorited, rest) = posts.partition { post ->
post.isFavorited()
}
favoritedList.addAll(favorited)
postsList.addAll(rest)