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

时间:2019-02-04 18:53:41

标签: scala

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

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,结果与预期的一样(“一个”的分组-> Set(1,11)...) 对于选项2,我得到一个空的Map。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

当您使用默认值在此地图上调用get(key)时,它永远不会添加您传递的钥匙,从它的外观来看,它将在地图中“空钥匙”的行上添加另一个钥匙,用于所有默认值,这就是为什么每次获取都得到相同的Set的原因,但不是您要寻找的值。