将列表分成几部分

时间:2016-11-19 23:25:15

标签: kotlin

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

例如:

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

5 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:26)

根据列表: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 :(得分:10)

更好的答案实际上是由VasyaFromRussia创作的答案。

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

如果您使用chunked,则只需编写:

val list = listOf(10, 2, 3, 4, 5, 6)
val chunked = list.chunked(2)
println(chunked)

打印出来:

[[10, 2], [3, 4], [5, 6]]

答案 3 :(得分:1)

答案 4 :(得分:1)

通过使用功能partition可以很好地划分列表。与groupBy不同的是,它不是按键将list分开,而是按谓词将结果Pair<List, List>给出。

这是一个例子:

val (favorited, rest) = posts.partition { post ->
    post.isFavorited()
}
favoritedList.addAll(favorited)
postsList.addAll(rest)