我正在学习scala,有时我想根据值(而不是键)从地图中删除条目。我还想知道删除了多少条目 - 我的程序期望只删除一个条目。 按照值删除条目可以通过应用filterNot来完成,确定 - 但是如何验证是否删除了一个条目?
到目前为止,我看到实现这一目标的唯一方法是运行谓词两次 - 一次用于"计数"方法(计算谓词匹配的频率),然后使用filterNot实际删除条目。
Scala实现这一目标的方法是什么?
我发现的唯一其他解决方案是首先使用filter(...)来获取要删除的值,然后使用" - "通过他们的钥匙扔出元素 - 但同样,这需要两次运行。
答案 0 :(得分:7)
只要您不介意从删除的信息中创建集合,就可以使用partition
:
scala> Map(1 -> 1, 2 -> 2, 3 -> 3)
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3)
scala> res0.partition { case (k, v) => v % 2 == 0 }
res3: (Map(2 -> 2),Map(1 -> 1, 3 -> 3))
答案 1 :(得分:5)
如果您只想知道是否只删除了一个条目,那么您可以使用size来获取过滤器操作之前和之后的大小。差异应该是一个。
scala> Map(1 -> 1, 2 -> 2, 3 -> 3)
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3)
scala> res0.filterNot { case (k, v) => v % 2 == 0 }
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 3 -> 3)
scala> res0.size - res1.size
res2: Int = 1
答案 2 :(得分:0)
对映射值考虑groupBy
,如下所示;让
val a = ((1 to 3) zip (11 to 33)).toMap
a: Map(1 -> 11, 2 -> 12, 3 -> 13)
然后
a.groupBy(_._2 % 2 == 0)
res: Map(false -> Map(1 -> 11, 3 -> 13), true -> Map(2 -> 12))