我只是想知道为什么我的值分组在下面的代码中不起作用。从技术上讲,Map和Set都是可变的,所以my 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。
发布于 2019-02-04 19:06:10
.withDefaultValue不向Map添加值。使用.getOrElseUpdate(strVal, Set.empty).add(intVal)代替。
发布于 2019-02-04 19:21:22
当您用默认值调用此映射上的get( key )时,它从未添加您传递的键,从它的外观来看,它在映射中的“空键”行中为所有默认值添加了另一个键--这就是为什么每次执行get时都会得到相同的设置,但这不是您要寻找的值。
https://stackoverflow.com/questions/54522572
复制相似问题