将过滤器应用于scala Map时,如何检查删除的条目?

时间:2014-10-16 10:37:56

标签: scala map

我正在学习scala,有时我想根据值(而不是键)从地图中删除条目。我还想知道删除了多少条目 - 我的程序期望只删除一个条目。 按照值删除条目可以通过应用filterNot来完成,确定 - 但是如何验证是否删除了一个条目?

到目前为止,我看到实现这一目标的唯一方法是运行谓词两次 - 一次用于"计数"方法(计算谓词匹配的频率),然后使用filterNot实际删除条目。

Scala实现这一目标的方法是什么?

我发现的唯一其他解决方案是首先使用filter(...)来获取要删除的值,然后使用" - "通过他们的钥匙扔出元素 - 但同样,这需要两次运行。

3 个答案:

答案 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))