gpt4 book ai didi

scala - 在循环中填充 map [Scala]

转载 作者:行者123 更新时间:2023-12-04 21:53:35 24 4
gpt4 key购买 nike

恐怕这是另一个菜鸟问题。

我想做的是使用 Map为了计算一个词在诗歌中出现的频率……m,然后将结果打印到控制台。
我转到了以下我认为有效的代码(虽然可能不太习惯):

val poe_m="""Once upon a midnight dreary, while I pondered weak and weary,
|Over many a quaint and curious volume of forgotten lore,
|While I nodded, nearly napping, suddenly there came a tapping,
|As of some one gently rapping, rapping at my chamber door.
|`'Tis some visitor,' I muttered, `tapping at my chamber door -
|Only this, and nothing more.'"""

val separators=Array(' ',',','.','-','\n','\'','`')
var words=new collection.immutable.HashMap[String,Int]
for(word<-poe_m.stripMargin.split(separators) if(!word.isEmpty))
words=words+(word.toLowerCase -> (words.getOrElse(word.toLowerCase,0)+1))

words.foreach(entry=>println("Word : "+entry._1+" count : "+entry._2))

据我了解,在 Scala 中,不可变数据结构优于可变数据结构和 val优于 var所以我面临两难: words应该是 var (允许每次迭代使用一个新的 map 实例)如果结果存储在不可变的 Map 中转弯时 wordsval暗示使用可变 Map .

有人能告诉我处理这个存在问题的正确方法吗?

最佳答案

在这种情况下,您可以使用 groupBymapValues :

val tokens = poe_m.stripMargin.split(separators).filterNot(_.isEmpty)
val words = tokens.groupBy(w => w).mapValues(_.size)

更一般地说,这是一项折叠工作:
 val words = tokens.foldLeft(Map.empty[String, Int]) {
case (m, t) => m.updated(t, m.getOrElse(t, 0) + 1)
}

Wikipedia entry on folds给出了一些很好的澄清例子。

关于scala - 在循环中填充 map [Scala],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335465/

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