scala – 访问/初始化和更新可变地图中的值
考虑使用可变图来跟踪事件/计数的简单问题,即:
val counts = collection.mutable.Map[SomeKeyType,Int]() 我目前的增加计数方法是: counts(key) = counts.getOrElse(key,0) + 1 // or equivalently counts.update(key,counts.getOrElse(key,0) + 1) 这有点笨拙,因为我必须指定两次密钥.在表现方面,我也希望这个关键字必须在地图上放置两次,我想避免.有趣的是,如果Int提供一些修改自身的机制,则不会发生此访问和更新问题.从Int更改为提供增量功能的Counter类,例如允许: // not possible with Int counts.getOrElseUpdate(key,0) += 1 // but with a modifiable counter counts.getOrElseUpdate(key,new Counter).increment 不知何故,我总是期望使用可变地图(有点类似于转换但不返回新集合和具有默认值的特定键)具有以下功能: // fictitious use counts.updateOrElse(key,_ + 1) // or alternatively counts.getOrElseUpdate(key,0).modify(_ + 1) 然而,就我所见,这样的功能不存在.通常(性能和语法方面)有这样一个f:A =>就地修改的可能性?可能我只是在这里遗漏了一些东西…我想这个问题必须有更好的解决方案,这样做不需要这样的功能? 更新: 我应该澄清一点,我知道的是DefaultValue,但问题仍然是一样的:执行两次查找仍然是两倍,不管是否是O(1)操作.坦白说,在许多情况下,我将会非常乐意实现因素2的加速.显然,修改关闭的构造通常可以移动到循环之外,因此与运行时相比,这不是一个大问题操作不必要两次. 解决方法
您可以使用默认值创建地图,这将允许您执行以下操作:
scala> val m = collection.mutable.Map[String,Int]().withDefaultValue(0) m: scala.collection.mutable.Map[String,Int] = Map() scala> m.update("a",m("a") + 1) scala> m res6: scala.collection.mutable.Map[String,Int] = Map(a -> 1) 作为Impredicative提到的,地图查找很快,所以我不用担心2查找. 更新: Debilski指出,您可以通过以下方式更简单地做到这一点: scala> val m = collection.mutable.Map[String,Int]().withDefaultValue(0) scala> m("a") += 1 scala> m res6: scala.collection.mutable.Map[String,Int] = Map(a -> 1) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |