在循环中填充地图[Scala]
发布时间:2020-12-16 18:24:11 所属栏目:安全 来源:网络整理
导读:我担心这是另一个菜鸟问题. 我想要做的是使用Map来计算一个单词出现在poe …中的频率,然后将结果打印到控制台. 我转到下面的代码,我相信它正在工作(虽然可能不是很惯用): val poe_m="""Once upon a midnight dreary,while I pondered weak and weary,|Over
我担心这是另一个菜鸟问题.
我想要做的是使用Map来计算一个单词出现在poe …中的频率,然后将结果打印到控制台. 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优于varso我面临两难选择:单词应该是var(允许每个迭代使用一个新的map实例)要存储在不可变的Map中,而将单词转换为val意味着使用可变的Map. 有人可以告诉我处理这个存在问题的正确方法吗? 解决方法
在这种情况下,您可以使用groupBy和mapValues:
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提供了一些很好的澄清示例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |