2016-11-19 19 views
5

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]] 
+1

to funkcja wymagana dla Kotlin 1.1: https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/window-sliding.md – succcubbus

+0

Możliwe duplikaty: http://stackoverflow.com/q/ 34498368/3255152 – mfulton26

+2

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

Odpowiedz

10

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 
} 
+1

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

+0

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

+0

@ mfulton26 dzięki za powiadomienie, odpowiednio zaktualizowano odpowiedź. – miensol

Powiązane problemy