我是一个新学习者,我想计算文件中不同单词的数量。
这工作正常
val filePath = "C:\Users\76274\Desktop\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]())(
(result,str) =>
str.split("\W+").foldLeft(result)(
(result,word) => result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1))))
}
这将返回一个空的地图
val filePath = "C:\Users\76274\Desktop\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]()){
(result,str) => {
str.split("\W+").foreach(word => {
result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1))
println(result)
})}
result
}
}
我不知道为什么后面的不起作用。作为一个Java
程序员,我认为它也应该工作得很好。我希望你能解释一下,谢谢!
第二个方法不起作用的原因是因为+
方法并没有真正向 Map 添加元素,而是创建一个新Map,添加/更新给定元素 - scaladoc。
如果你想让第二个使用MUTABLE映射工作,你可以使用+=
方法-scaladoc。顺便说一句,如果您要寻求可变解决方案,我也不会费心在第一级使用 fold,而是使用另一个 foreach。
但是,在 Scala 中,我们更喜欢不可变的,这就是为什么我们会选择第一个带有不可变映射
的映射。PS:与此无关,但除非您真的需要它成为HashMap,否则更喜欢Map
特征(默认情况下是不可变的(或scala.collection.mutable.Map
(可变的(。另外,要创建一个空集合,更常见的是调用empty
方法,而不是空的应用()
。例如Map.empty[String, Int]
.