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

Wol*_*ich 3 scala map

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

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

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

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

Sea*_*ira 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))
Run Code Online (Sandbox Code Playgroud)


moh*_*hit 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
Run Code Online (Sandbox Code Playgroud)