2016-11-19 6 views
5

Gibt es eine einfache Möglichkeit, Liste in Teile (vielleicht einige Lambda) in Kotlin zu teilen?Liste in Teile aufteilen

Zum Beispiel:

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

das ist eine Funktion, die für Kotlin 1.1 angefordert wird: https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/window-sliding.md – succcubbus

+0

Mögliche Duplikate: http://stackoverflow.com/q/ 34498368/3255152 – mfulton26

+2

Wenn Sie in zwei Teile partitionieren möchten, würde https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/partition.html tun, was Sie tun möchten. z.B. 'list.partition {x -> x <4}' – carpeliam

Antwort

10

die Liste Gegeben: val list = listOf(1, 2, 3, 4, 5, 6) können Sie verwenden groupBy:

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

Oder wenn Ihre Werte sind nicht Zahlen Sie können ihnen zuerst einen Index zuweisen:

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

Oder wenn Sie möchten, dass einige Zuführungen sparen Sie ein bisschen mehr manuelle Art und Weise mit foldIndexed gehen kann:

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

Für ['groupBy'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html)," die Die zurückgegebene Map behält die Reihenfolge der Iterationen der Schlüssel bei, die aus der ursprünglichen Sammlung erstellt wurden. " Als solches kann Ihr erstes Beispiel zu 'list.groupBy {(it + 1)/2} .values' vereinfacht werden. – mfulton26

+0

Kotlin hat ['withIndex'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/with-index.html), was Ihr zweites Beispiel etwas lesbarer machen kann:' list .withIndex(). groupBy {it.index/2} .values.map {it.map {it.value}} '. – mfulton26

+0

@ mfulton26 danke für die Nachricht, aktualisiert die Antwort entsprechend. – miensol

Verwandte Themen