私は簡単なScalaコードを持っています。私は逐次List of Stringsをループし、リストrのタプル(String、Int)として収集する各Stringの出現を数えたいと思います。メイン関数の部分は残る必要があります(したがって、groupBy
など)。私の質問は、更新機能についてです:このScalaフラグメントで1ループでオカレンスをカウントできますか?
今私はfind
をまず実行し、存在しなければrに新しいタプルを追加します。それが存在する場合、私はrをループし、一致するStringのカウンタを更新します。
更新機能をより効率的に変更することはできますか? 1回の反復で更新できます(存在しない場合は追加、存在する場合はカウンタを更新します)。私はあなたが機能的なスタイルのために行くとScalaのコレクションの電源を使用することをお勧め
おかげ
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'が変更されないかもしれないことを意味するかもしれません。だから、あなたは明確にしてもらえますか? –
私はまた、レイジーコレクションで作業したいからです。または、怠惰なコレクションや 'Streams'(または' Source.getLines')に 'groupBy'を使うこともできますか?もしそうなら、私に例を挙げてください。 –