有没有一种简单的方法可以将列表分成Kotlin中的部分(可能是一些lambda)?
例如:
[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]
答案 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)
API说有一个GroupBy函数,它可以做你想要的。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html
或者使用子列表并自行分解
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/sub-list.html
答案 4 :(得分:1)
通过使用功能partition
可以很好地划分列表。与groupBy
不同的是,它不是按键将list分开,而是按谓词将结果Pair<List, List>
给出。
这是一个例子:
val (favorited, rest) = posts.partition { post ->
post.isFavorited()
}
favoritedList.addAll(favorited)
postsList.addAll(rest)