【问题标题】: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】:
带有单个 <- 生成器的 for 理解对原始集合进行了 map() 调用。而且,您还记得,map() 可以更改集合的元素,但不会更改集合类型本身。
所以如果dictionary 是List,那么你最终得到的将是List。 yield 指定生成的 List 中的下一个元素。
在您的情况下,代码为dictionary 中的每个元素创建一个新的单元素Map。可能不是你想要的。我建议你尝试使用foldLeft()。