【发布时间】:2014-04-12 20:26:16
【问题描述】:
我对 Scala 非常陌生,希望能得到任何帮助(我到处寻找,过去 8 个小时都在试图解决这个问题)
目前我有
def apply(file: String) : Iterator[String] = {
scala.io.Source.fromFile(file).getLines().map(_.toLowerCase)
}
还有
def groupFreq[A,B](xs: Iterator[A], f: A => B): HashMap[B, Int] = {
var freqMap = new HashMap[B, Int]
for (x <- xs) freqMap = freqMap + ( f(x) -> ( freqMap.getOrElse( f(x) , 0 ) +1 ) )
freqMap
}
apply 只获取我们传入的单词文件。
GroupFreq 采用 xs: Iterator[A] 和一个将 A 值转换为其 B 组的分组函数 f。 该函数返回一个 HashMap,对于每个 B 组,计算属于该组的 A 值的数量。
我使用这两个函数来帮助我使用 charFreq,这个函数同时使用 apply 和 groupFreq 来传回一个 HashMap,它计算一个 Char 在整个文件中出现的次数。如果 char 没有出现在文件中的任何位置,那么应该没有它的映射。
def charFreq(file: String): HashMap[Char, Int] =
{
var it = Iterator[Char]()
val words = apply(file)
for {
xs<-words
} yield { it = it ++ xs.toIterator }
val chars = it
val grouper = (x: Char) => x
groupFreq(chars, grouper)
}
我的解决方案编译和应用,groupFreq 按预期工作,但是当我运行 charFreq 时,它说
charFreq 抛出异常:java.util.NoSuchElementException: key not 找到:d
我认为我做错了什么,很可能是我的 for 循环和产量,但我已经多次了解逻辑,但我不明白为什么它不起作用。
Google 和 StackOverflow 都推荐了平面地图,但我也无法让它发挥作用。
任何帮助将不胜感激。请记住,这是一个设置了骨架方法的类分配,因此我无法更改 apply 和 groupFreq 和 charFreq 的设置方式,我只能操作我尝试过的主体。
【问题讨论】:
标签: java scala iterator hashmap key