【发布时间】:2020-12-26 21:50:14
【问题描述】:
我需要在 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/sequences(不允许显式的 for/while 循环)。 我尝试使用 runningReduce 和 runningFold,但它在每个步骤中都会创建一个结果列表,这在这种情况下是不可取的(您应该仅在谓词不再满足时才创建一个子列表)。
编辑: 我注意到similar question 存在,但该问题并未强调需要功能性解决方案,因此我将保留此问题。
【问题讨论】:
-
这是一个练习,还是用于生产?几乎可以肯定 可能 使用 fold-type 调用 - 尽管您可能需要先执行 zipWithNext() 之类的操作,以便知道何时开始新的子列表。但我怀疑它会更简单,更易于维护,在带有 while 循环的命令式风格中......
-
这是一个练习。对于实现(命令式/函数式)没有施加任何限制,但我想尝试函数式的方式,因为命令式的方式非常简单。
-
这能回答你的问题吗? Split a list based on condition in kotlin这个问题的标题没有“连续”,但应该有。将很快对其进行编辑。我相信这几乎是完全相同的副本。
-
@Fureeish 查看编辑
-
好吧,如果该问题涵盖了您的问题中的内容并且该答案回答了您的问题,我建议接受重复标志。
标签: kotlin lambda functional-programming