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)。