预期 Map[] 但找到 List[Map[]]
Expected Map[] but Found List[Map[]]
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)))
}
for
对单个 <-
生成器的理解将对原始集合的 map()
调用脱糖。而且,您会记得,map()
可以更改集合的元素,但不会更改集合类型本身。
因此,如果 dictionary
是 List
,那么您最终得到的将是 List
。 yield
指定结果 List
.
中的下一个元素是什么
在您的例子中,代码正在为 dictionary
中的每个元素创建一个新的单元素 Map
。可能不是你想要的。我建议您尝试使用 foldLeft()
.
请注意,在这种情况下,您可能希望一次性构建 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
来避免创建中间列表。
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)))
}
for
对单个 <-
生成器的理解将对原始集合的 map()
调用脱糖。而且,您会记得,map()
可以更改集合的元素,但不会更改集合类型本身。
因此,如果 dictionary
是 List
,那么您最终得到的将是 List
。 yield
指定结果 List
.
在您的例子中,代码正在为 dictionary
中的每个元素创建一个新的单元素 Map
。可能不是你想要的。我建议您尝试使用 foldLeft()
.
请注意,在这种情况下,您可能希望一次性构建 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
来避免创建中间列表。