scala - 计算出现单词的每一行
scala - count every line in which a word occurs
我想找到创建一个以单词作为键并以整数列表作为值的映射。
列表中的整数应将行号表示为索引。像这样:
Map("test" -> List(0, 2), "test2"->List(1),"foo" -> List(0, 3), "bar" -> List(2))
这意味着单词 test 出现在第 0 和 2 行,foo 出现在第 0 和 3 行,而 bar 仅出现在第 2 行。
我已经设法创建了一行文本中出现的所有单词的列表,并将它们读入列表,例如
val wordsWithLine= List((0,"test"), (0,"foo"), (1,"test2"), (2,"test"), (2,"bar"), (0,"test"), (3,"foo"))
现在我卡住了,不知道如何创建这张地图。我知道函数定义必须是这样的,但我不知道如何实现它:
def createIndexMap(listwithIndices: List[(Int, String)]): Map[String, List[Int]] = {???}
我的想法是使用 groupMapReduce()
?但我无法理解这是如何工作的。
总体而言,我对 Scala 和函数式编程还很陌生,因此非常感谢任何提示
你只需要groupMap
def createIndexMap(listwithIndices: List[(Int, String)]): Map[String, List[Int]] =
listwithIndices.groupMap(_._2)(_._1)
首先你需要按单词分组,然后映射结果,这样键仍然是一个单词,但值是一个不同的行号列表:
listwithIndices.groupBy(wWI => wWI._2).map(group => group._1 -> group._2.map(item => item._1).distinct)
我建议在 scala interactive shell 中使用这段代码来弄清楚它是如何工作的。
可以使用其他(更简洁)的方式(使用 groupMap 或 groupBy 和 mapValues)。
我想找到创建一个以单词作为键并以整数列表作为值的映射。 列表中的整数应将行号表示为索引。像这样:
Map("test" -> List(0, 2), "test2"->List(1),"foo" -> List(0, 3), "bar" -> List(2))
这意味着单词 test 出现在第 0 和 2 行,foo 出现在第 0 和 3 行,而 bar 仅出现在第 2 行。
我已经设法创建了一行文本中出现的所有单词的列表,并将它们读入列表,例如
val wordsWithLine= List((0,"test"), (0,"foo"), (1,"test2"), (2,"test"), (2,"bar"), (0,"test"), (3,"foo"))
现在我卡住了,不知道如何创建这张地图。我知道函数定义必须是这样的,但我不知道如何实现它:
def createIndexMap(listwithIndices: List[(Int, String)]): Map[String, List[Int]] = {???}
我的想法是使用 groupMapReduce()
?但我无法理解这是如何工作的。
总体而言,我对 Scala 和函数式编程还很陌生,因此非常感谢任何提示
你只需要groupMap
def createIndexMap(listwithIndices: List[(Int, String)]): Map[String, List[Int]] =
listwithIndices.groupMap(_._2)(_._1)
首先你需要按单词分组,然后映射结果,这样键仍然是一个单词,但值是一个不同的行号列表:
listwithIndices.groupBy(wWI => wWI._2).map(group => group._1 -> group._2.map(item => item._1).distinct)
我建议在 scala interactive shell 中使用这段代码来弄清楚它是如何工作的。
可以使用其他(更简洁)的方式(使用 groupMap 或 groupBy 和 mapValues)。