gpt4 book ai didi

kotlin - 将 block 列表分成连续的相同对象的列表

转载 作者:行者123 更新时间:2023-12-02 13:07:51 26 4
gpt4 key购买 nike

假设我有一个函数,可以将字符列表收集到所有连续相同字符的列表中:

 [a, a, b, a, b, b, b, c, c, c, c] -> [[a, a], [b], [a], [b, b, b], [c, c, c, c]]

我的解决方案是手动填充 ArrayList,如下所示:

fun foo(chars: List<Char>): List<List<Char>> {
val result = arrayListOf<ArrayList<Char>>()
var part = arrayListOf(chars.first())
var cur = chars.first()
for (char in chars.drop(1)){
if (cur == char) part.add(char)
else {
cur = char
result.add(part)
part = arrayListOf(char)
}
}
if(part.isNotEmpty()) result.add(part)
return result
}

然而,这看起来非常不优雅,所以我认为必须有更好的方法来做到这一点。有什么想法吗?

最佳答案

您可以使用groupBy [函数][1]:

val chars = listOf('a', 'a', 'b', 'a')

val result = chars.groupBy { it } // Map<Char,List<Char>> = ['a' to ['a','a'], 'b' to ['b']]

如果您之后想要列表列表,只需使用 result.values

编辑

感谢您指出,答案不应包括所有群体,而应包括后续群体。这个问题的解决方案有点长:

val chars = listOf('a', 'a', 'b', 'a')

val result = chars.fold(mutableListOf<Char>() to mutableListOf<List<Char>>()) { (currentList, allLists), currentItem ->

if (currentList.isEmpty()) { // Applies only to the very first item
mutableListOf(currentItem) to allLists
} else {

if (currentItem == currentList.first()) { // same char
currentList.apply { add(currentItem) } to allLists
} else {
mutableListOf(currentItem) to allLists.apply { add(currentList) } // Next
}

}
}
.let { it.second.apply { add(it.first) } } //Convert to List<List<Char>> and add last remaining list

关于kotlin - 将 block 列表分成连续的相同对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58199010/

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