【问题标题】:Expected Map[] but Found List[Map[]]预期地图 [] 但找到列表 [地图 []]
【发布时间】:2020-08-25 12:23:14
【问题描述】:

scala 程序正在遍历单词列表,如果已经找到,则在单词列表中添加值,否则添加 key->word。预计会生成 Map[],但会生成 List[Map[]]。

    val hashmap:Map[List[(Char, Int)], List[String]]=Map()
    for (word <- dictionary) yield {
      val word_occ = wordOccurrences(word)
      hashmap + (if (hashmap.contains(word_occ)) (word_occ -> (hashmap(word_occ) ++ List(word))) else (word_occ -> List(word)))
    }

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    请注意,在这种情况下,您可能希望一次性构建Map,而不是修改可变的Map

    val hashmap:Map[List[(Char, Int)], List[String]]=
      dictionary
        .map(x => (wordOccurrences(x), x))
        .groupBy(_._1)
        .map { case (k, v) => k -> v.map(_._2) }
    

    在 Scala 2.13 中,您可以将最后两行替换为

        .groupMap(_._1)(_._2)
    

    如果性能是一个重要问题,您还可以在dictionary 上使用view 以避免创建中间列表。

    【讨论】:

      【解决方案2】:

      带有单个 &lt;- 生成器的 for 理解对原始集合进行了 map() 调用。而且,您还记得,map() 可以更改集合的元素,但不会更改集合类型本身。

      所以如果dictionaryList,那么你最终得到的将是Listyield 指定生成的 List 中的下一个元素。

      在您的情况下,代码为dictionary 中的每个元素创建一个新的单元素Map。可能不是你想要的。我建议你尝试使用foldLeft()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        相关资源
        最近更新 更多