加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在循环中填充地图[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提供了一些很好的澄清示例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读