将列表分成几部分

Let*_*far 27 kotlin

是否有一种简单的方法可以将列表分成Kotlin中的部分(可能是一些lambda)?

例如:

[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]
Run Code Online (Sandbox Code Playgroud)

Vas*_*sia 49

从Kotlin 1.2开始,您可以使用Iterable<T>.chunked(size: Int): List<List<T>>stdlib中的函数(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html).


mie*_*sol 26

鉴于列表:val list = listOf(1, 2, 3, 4, 5, 6)您可以使用groupBy:

list.groupBy { (it + 1) / 2 }.map { it.value }
Run Code Online (Sandbox Code Playgroud)

或者,如果您的值不是数字,您可以先为它们分配索引:

list.withIndex()
    .groupBy { it.index / 2 }
    .map { it.value.map { it.value } }
Run Code Online (Sandbox Code Playgroud)

或者,如果您想保存一些分配,可以使用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
}
Run Code Online (Sandbox Code Playgroud)


gil*_*des 13

更好的答案实际上是VasyaFromRussia撰写的答案.

如果使用groupBy,则必须添加并索引,然后进行后处理从IndexedValue对象中提取值.

如果你使用chunked,你只需要写:

val list = listOf(10, 2, 3, 4, 5, 6)
val chunked = list.chunked(2)
println(chunked)
Run Code Online (Sandbox Code Playgroud)

打印出:

[[10, 2], [3, 4], [5, 6]]
Run Code Online (Sandbox Code Playgroud)


Ern*_*zyk 6

划分列表的好方法是使用函数partition。不像groupBy它不按键划分列表,而是按Pair<List, List>结果给出的谓词划分。

下面是一个例子:

val (favorited, rest) = posts.partition { post ->
    post.isFavorited()
}
favoritedList.addAll(favorited)
postsList.addAll(rest)
Run Code Online (Sandbox Code Playgroud)