用mutable.Map和mutable.et折叠使用Set.add时不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用mutable.Map和mutable.et折叠使用Set.add时不起作用相关的知识,希望对你有一定的参考价值。

我只是想知道为什么我的值分组在下面的代码中不起作用。从技术上讲,Map和Set都是可变的,因此我的add(intValue)应该更改集合(并间接地更改聚合器映射)。

import scala.collection.mutable._

val original = Iterator[(String, Int)](
  "one" -> 1,
  "two" -> 20,
  "three" -> 30,
  "one" -> 11
)

val folded = original.foldLeft(
  Map[String, Set[Int]]().withDefaultValue(Set.empty))
{
  case (agg, (strVal, intVal)) =>
    //agg += ((strVal, agg(strVal) + intVal))  <-- option 1  works
    agg(strVal).add(intVal)  // <--- option 2 does not work
    agg                      // <--- option 2 does not work   
}

对于选项1,结果如预期(分组为“一” - >设置(1,11)...)对于选项2,我得到一个空的Map。

答案

.withDefaultValue没有将值添加到Map。请改用.getOrElseUpdate(strVal, Set.empty).add(intVal)

另一答案

当你使用默认值调用此地图上的get(key)时,它永远不会添加你传递的密钥,从它的外观来看,它会在地图中的“null key”行上为所有默认值添加另一个键,这就是为什么你每次获得相同的Set,但它不是你想要的价值。

以上是关于用mutable.Map和mutable.et折叠使用Set.add时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将元素添加到scala.collection.mutable.Map的语法是什么?

高效的方法将键和值添加到scala中的Set Map

Scala映射

scala 数据结构:映射 Map

映射和元组

Scala Map与Tuple