У меня есть простой фрагмент кода Scala.Я последовательно перебираю список строк и хочу подсчитать вхождение каждой строки, которую я собираю в виде кортежей (String, Int) в списке r.Часть в основной функции должна остаться (поэтому нет 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
}