gpt4 book ai didi

kotlin - 如何使用 Kotlin 的谓词将列表拆分为子列表?

转载 作者:行者123 更新时间:2023-12-01 23:38:29 26 4
gpt4 key购买 nike

我正在尝试一种惯用的、理想的功能性方法来将 Kotlin 中的列表拆分为子列表。

假设输入是["aaa", "bbb", "", "ccc", "", "ddd", "eee", "fff"],我想返回[["aaa", "bbb"], ["ccc"], ["ddd", "eee", "fff"]] 给定谓词 string.isEmpty()

使用 for 循环和累加器非常简单;但我还没有找到一种我认为足够可读的功能性编写方法。

到目前为止,我最好的结果是:

lines.foldIndexed(Pair(listOf<List<String>>(), listOf<String>()), { idx, acc, line ->
when {
idx + 1 == lines.size -> {
Pair(acc.first + listOf(acc.second + line), listOf())
}
line.isEmpty() -> {
Pair(acc.first + listOf(acc.second), listOf())
}
else -> {
Pair(acc.first, acc.second + line)
}
}
}).first

本质上,我使用的是带有双累加器的 fold,它跟踪当前列表并在找到谓词时重置。该列表会在此时输入完整的结果。我正在使用 foldIndexed为了得到我的最后一个列表。

大家有什么更好的办法吗?

作为引用,循环版本可以是

val data = mutableListOf<String>()
var currentData = ""
for(line in lines){
if(line.isEmpty()) {
data.add(currentData)
currentData = ""
}
else{
currentData = "$currentData $line"
}
}
data.add(currentData)

谢谢!

最佳答案

我建议先找到 split 点(手动添加边缘索引),然后再做切片:

val lines = listOf("aaa", "bbb", "", "ccc", "", "ddd", "eee", "fff")
val result = lines
.flatMapIndexed { index, x ->
when {
index == 0 || index == lines.lastIndex -> listOf(index)
x.isEmpty() -> listOf(index - 1, index + 1)
else -> emptyList()
}
}
.windowed(size = 2, step = 2) { (from, to) -> lines.slice(from..to) }
println(result) //[[aaa, bbb], [ccc], [ddd, eee, fff]]

关于kotlin - 如何使用 Kotlin 的谓词将列表拆分为子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65248942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com