【发布时间】:2016-08-23 22:59:04
【问题描述】:
我正在开发一个有状态的应用程序。对于状态,我需要一个具有哈希键和与该键相关的值集合的数据结构。
集合应该是高效的并且占用尽可能少的内存。集合应该是可变的:需要删除或添加项目。
Scala 中有这样的集合吗?
【问题讨论】:
-
mutable.Map[K,mutable.Set[V]]有什么问题?
标签: scala collections
我正在开发一个有状态的应用程序。对于状态,我需要一个具有哈希键和与该键相关的值集合的数据结构。
集合应该是高效的并且占用尽可能少的内存。集合应该是可变的:需要删除或添加项目。
Scala 中有这样的集合吗?
【问题讨论】:
mutable.Map[K,mutable.Set[V]] 有什么问题?
标签: scala collections
您正在寻找的基本结构是带有嵌套集合的地图:
Map[K, Set[V]]
通常,使用不可变值被认为是最佳实践:
val first_state: Map[String, Set[String]] = Map("A key" -> Set("Alpha", "Omega"))
val second_state = first_state + ("Another key" -> Set("Theta", "Iota"))
val third_state = second_state + ("Another key" -> Set("Kappa"))
以上结果如下:
first_state: Map[String,Set[String]] = Map(A key -> Set(Alpha, Omega))
second_state: scala.collection.immutable.Map[String,Set[String]] = Map(A key -> Set(Alpha, Omega), Another key -> Set(Theta, Iota))
third_state: scala.collection.immutable.Map[String,Set[String]] = Map(A key -> Set(Alpha, Omega), Another key -> Set(Kappa))
我们可以看到,您的第三种状态正是您在这种情况下所要寻找的,并且您实际上并不需要可变状态来执行您想要执行的操作。 This post 展示了一些关于如何操作不可变地图的示例,如果您需要更多。
请注意,如果不需要,Scala 会尝试不复制元素。因此,虽然从first_state 到third_state 似乎涉及两个完整的副本,但实际上并没有。除非您有特定和测量性能问题,否则您应该倾向于不可变状态(以更好地确保正确性)。鉴于您当前的问题,没有任何说明表明您需要可变状态。
【讨论】: