gpt4 book ai didi

kotlin - 基于函数式谓词对列表的连续元素进行分区

转载 作者:行者123 更新时间:2023-12-04 08:21:49 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Split a list into groups of consecutive elements based on a condition in Kotlin

(2 个回答)


8 个月前关闭。




我需要在 Kotlin 中实现一个函数:

fun <T> partitionConsecutiveWithPredicate(input : List<T>, pred : (T, T) -> Boolean) : List<List<T>>
当结果列表中的每个子列表都是原始列表中符合提供谓词的一组连续元素时,该函数将输入列表划分为列表列表。
示例 #1 - 调用 Int 列表上的方法 [2, 2, 2, 2, 5, 5, 8, 2, 2, 3]带谓词 { t1 : Int, t2 : Int -> t1 == t2}应该导致 [[2, 2, 2, 2], [5, 5], [8], [2, 2], [3]]示例 #2 - 调用 Int 列表上的方法 [1, 2, 3, 4, 3, 2, 1, 2]带谓词 { t1 : Int, t2 : Int -> t2 == t1 + 1}应该导致 [[1, 2, 3, 4], [3], [2], [1, 2]]自然地,我可以使用传统的 while 循环和列表操作库函数来实现这一点,但我想以纯函数风格来实现,即只使用 lambdas/序列(不允许显式 for/while 循环)。
我尝试使用 runningReduce 和 runningFold,但它在每个步骤中都会创建一个结果列表,这在这种情况下是不可取的(您应该仅在谓词停止满足时创建子列表)。

编辑:我注意到 similar question存在,但上述问题并未强调对功能性解决方案的需求,因此我将保持原样。

最佳答案

可能有更好的方法,一种方法是使用循环:

fun <T> partitionConsecutiveWithPredicate2(input: List<T>, pred: (T, T) -> Boolean): List<List<T>> {
val result = mutableListOf<List<T>>()
var currentList = mutableListOf<T>()
input.forEachIndexed { i, el ->
currentList.add(el)
if (i + 1 >= input.size || !pred(el, input[i + 1])) {
result.add(currentList.toList())
currentList = mutableListOf()
}
}
return result
}
这里的想法是累积 currentList 中的值。直到所有元素都被处理( i + 1 >= input.size )或谓词未满足,在这种情况下, currentList 被添加到结果中并清空。
kotlin 操场中的可执行代码: https://pl.kotl.in/rv_Yq8WdG具有功能和迭代版本。
或使用 fold :
fun <T> partitionConsecutiveWithPredicate(input: List<T>, pred: (T, T) -> Boolean)
= input
.fold(mutableListOf()) { acc: MutableList<MutableList<T>>, elem ->
when {
acc.lastOrNull() == null -> acc.add(mutableListOf(elem))
acc.lastOrNull() != null -> acc.last().apply {
if (pred(last(), elem)) {
add(elem)
} else {
acc.add(mutableListOf(elem))
}
}
}
acc
}
kotlin 操场中的可执行代码:
https://pl.kotl.in/z_ccIgX5C

关于kotlin - 基于函数式谓词对列表的连续元素进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65461007/

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