【问题标题】:scala - count every line in which a word occursscala - 计算出现单词的每一行
【发布时间】:2020-06-02 16:29:34
【问题描述】:

我想创建一个以单词为键、以整数列表为值的 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】:

    你只需要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)来实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多