scala - 统计每行出现的单词数量

问题描述 投票:0回答:1

我想创建一个Map,它的键是一个单词,值是一个整数列表。列表中的整数应该代表作为索引的行号。像这样。

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和函数式编程的新手,所以非常感谢任何提示。

scala mapreduce map-function
1个回答
2
投票

你只需要在Map("test"->List(0, 2), "... "中加入 groupMap

def createIndexMap(listwithIndices: List[(Int, String)]): Map[String, List[Int]] =
  listwithIndices.groupMap(_._2)(_._1)

2
投票

一开始你需要按字进行分组,然后将结果进行映射,使key还是一个字,但value是一个不同的行号列表。

listwithIndices.groupBy(wWI => wWI._2).map(group => group._1 -> group._2.map(item => item._1).distinct)

我建议在scala交互式shell中玩玩这段代码,看看它到底是如何工作的。

也可以用其他(更简洁的)方法(使用groupMap或groupBy和mapValues)。

© www.soinside.com 2019 - 2024. All rights reserved.