gpt4 book ai didi

list - 使用 scanLeft 打包符号

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

99 scala problems有这个问题:

Pack consecutive duplicates of list elements into sublists. If a list contains repeated elements they should be placed in separate sublists.

Example:
scala> pack(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e))
res0: List[List[Symbol]] = List(List('a, 'a, 'a, 'a), List('b), List('c, 'c), List('a, 'a), List('d), List('e, 'e, 'e, 'e))

我了解解决上述给定问题的尾递归方法。我想知道是否有一种方法可以使用 scanLeft 来完成上述操作,其中中间结果是公共(public)元素列表?

最佳答案

这是一个使用 foldLeft 的解决方案:

def pack[A](l:List[A]): List[List[A]] = l match {
case head :: tail =>
tail.foldLeft(List(List(head))) { (collector:List[List[A]], elem:A) =>
if (collector.head.head == elem)
(elem +: collector.head) +: collector.tail
else
List(elem) +: collector
}.reverse
case _ => List.empty
}

这只适用于列表。更好的解决方案可能是使用 MultiSets,尽管很难找到 Scala 实现。

关于list - 使用 scanLeft 打包符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844541/

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