【发布时间】:2010-11-25 09:23:20
【问题描述】:
我有一段简单的 Scala 代码。我按顺序循环遍历字符串列表,我想计算每个字符串在列表 r 中作为元组 (String, Int) 收集的每个字符串的出现次数。主函数中的部分应该保留(所以没有groupBy 或其他东西)。我的问题是关于更新功能:
现在我先做一个find,如果它不存在,然后将一个新元组添加到 r。如果它确实存在,我会遍历 r 并更新匹配字符串的计数器。
是否可以修改更新功能以提高效率? r 是否可以在一次迭代中更新(如果不存在则添加,如果存在则更新计数器)?
谢谢
var r = List[(String, Int)]() // (string, count)
def update(s: String, l: List[(String, Int)]) : List[(String, Int)] = {
if (r.find(a => a._1 == s) == None) {
(s, 1) :: r // add a new item if it does not exist
} else {
for (b <- l) yield {
if (b._1 == s) {
(b._1, b._2 + 1) // update counter if exists
} else {
b // just yield if no match
}
}
}
}
def main(args : Array[String]) : Unit = {
val l = "A" :: "B" :: "A" :: "C" :: "A" :: "B" :: Nil
for (s <- l) r = update(s, r)
r foreach println
}
【问题讨论】:
-
我不明白您对
groupBy的反对意见是什么。好像是说main定义中的代码可能不会被解决方案改变;这也可能意味着l可能不会更改。那么,你能澄清一下吗? -
主要是因为我也想使用惰性集合。或者您也可以将
groupBy用于惰性集合和Streams(或Source.getLines)?如果有,请举个例子。
标签: scala