此函数计算列表中指定位置的单词数,并输出一个Map,其中包含单词以及列表中提到该单词的次数:
def getTopLinks(data: List[String], positionOfElementToCount: Int) = {
val words = data.map(d => d.split(",")(positionOfElementToCount).trim)
val wordCount: Map[String, Int] = words.foldLeft(Map.empty[String, Int]) { (m, x) => m + ((x, m.getOrElse(x, 0) + 1)) }
val sortedWordCount = wordCount.toList.sortBy { _._2 }.reverse
sortedWordCount
}
此方法抛出java.lang.ArrayIndexOutOfBoundsException。但是如何在上面的函数中忽略这个异常。如果为List中的元素抛出异常,则忽略它并继续。我不认为我可以包围一个try catch周围的行val words = data.map(d => d.split(“,”)(positionOfElementToCount).trim)因为那时我无法继续处理因为抛出了异常在这个陈述的某个地方。
如果这个过程在for循环中发生,那么我可以在一个违规的行周围包裹一个try catch并继续,但我认为在这种情况下我不能这样做吗?
答案 0 :(得分:3)
试试这个:
val words = data.map(d => d.split(",").drop(positionOfElementToCount).headOption)
返回所需索引上的元素选项,如果索引大于数组大小,则不会抛出异常
答案 1 :(得分:1)
应该用这个:
val words = data.flatMap { d =>
val split = d.split(",")
if (split.isDefinedAt(positionOfElementToCount))
Some(split(positionOfElementToCount))
else None
}
一个更简单的完整版本(包括更简洁的@serejja代码)将是:
def getTopLinks(data: List[String], positionOfElementToCount: Int) = {
val words = data.flatMap { d => d.split(",").drop(positionOfElementToCount).headOption }
words.view.groupBy(x => x).map(x => (x._1 -> x._2.size)).toList
}
答案 2 :(得分:1)
试试这个:
val words = data.flatMap(d => d.split(",").slice(index, index+1).headOption)