Czy istnieje prosty sposób na podzielenie listy na części (może niektóre lambda) w Kotlin?Podziel listę na części
Na przykład:
[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]
Czy istnieje prosty sposób na podzielenie listy na części (może niektóre lambda) w Kotlin?Podziel listę na części
Na przykład:
[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]
Biorąc lista: val list = listOf(1, 2, 3, 4, 5, 6)
można użyć groupBy
:
list.groupBy { (it + 1)/2 }.map { it.value }
lub jeśli wartości nie są liczbami możesz najpierw przypisać do nich indeks:
list.withIndex()
.groupBy { it.index/2 }
.map { it.value.map { it.value } }
Lub jeśli chcesz zaoszczędzić trochę przydziały można pójść nieco więcej ręczny sposób z 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
}
Dla ['groupBy'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html)," Zwrócona mapa zachowuje kolejność iteracji wpisu kluczy wyprodukowanych z oryginalnej kolekcji. " Jako taki, twój pierwszy przykład można uprościć do 'list.groupBy {(it + 1)/2} .values'. – mfulton26
Kotlin ma ['zIndex'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/with-index.html), dzięki czemu twój drugi przykład może być również bardziej czytelny:' list .withIndex(). groupBy {it.index/2} .values.map {it.map {it.value}} '. – mfulton26
@ mfulton26 dzięki za powiadomienie, odpowiednio zaktualizowano odpowiedź. – miensol
API mówi, że jest to funkcja GroupBy, co powinni robić, co chcesz.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html
Albo użyć podmenu i złamać go sobie
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/sub-list.html
Od Kotlin 1.2 można użyć Iterable<T>.chunked(size: Int): List<List<T>>
funkcję z stdlib (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html).
to funkcja wymagana dla Kotlin 1.1: https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/window-sliding.md – succcubbus
Możliwe duplikaty: http://stackoverflow.com/q/ 34498368/3255152 – mfulton26
Jeśli chcesz podzielić się na _two_ części, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/partition.html zrobi to, co chcesz. na przykład 'list.partition {x -> x <4}' – carpeliam