【发布时间】:2015-03-05 23:23:00
【问题描述】:
另一个 Scala 新手问题,因为我不知道如何以功能方式实现这一点(主要来自脚本语言背景):
我有一个字符串列表:
val food-list = List("banana-name", "orange-name", "orange-num", "orange-name", "orange-num", "grape-name")
在它们重复的地方,我想在字符串中添加一个递增的数字,并在类似于输入列表的列表中获取它,如下所示:
List("banana-name", "orange1-name", "orange1-num", "orange2-name", "orange2-num", "grape-name")
我已将它们分组以计算它们的数量:
val freqs = list.groupBy(identity).mapValues(v => List.range(1, v.length + 1))
这给了我:
Map(orange-num -> List(1, 2), banana-name -> List(1), grape-name -> List(1), orange-name -> List(1, 2))
列表的顺序很重要(它应该是food-list 的原始顺序)所以我知道此时使用地图对我来说是有问题的。我觉得最接近解决方案的是:
food-list.map{l =>
if (freqs(l).length > 1){
freqs(l).map(n =>
l.split("-")(0) + n.toString + "-" + l.split("-")(1))
} else {
l
}
}
这当然给了我一个不稳定的输出,因为我正在从freqs 中的单词值映射频率列表
List(banana-name, List(orange1-name, orange2-name), List(orange1-num, orange2-num), List(orange1-name, orange2-name), List(orange1-num, orange2-num), grape-name)
如何以 Scala fp 方式完成此操作,而无需使用笨拙的 for 循环和计数器?
【问题讨论】:
-
每次给定值的上一次出现都可以计数,还是太慢了(O(n^2))?
-
就我的目的而言,我不会有任何列表太长以至于会产生明显的差异,因此以前的出现不会成为问题,但试图找出 Scala 中的有效计数即将到来来自 Python 目前对我来说不是很明显
-
count(scala-lang.org/api/current/…) 方法在Seqs 上可用,所以我认为可能与 Python 非常相似。无论如何,我最后的解决方案没有使用它,虽然它需要一个reverse,所以它不是最有效的。
标签: string list scala increment