【问题标题】:When applying filter to a scala Map, how can I also check what entries were removed?将过滤器应用于 scala Map 时,我如何还可以检查删除了哪些条目?
【发布时间】:2014-10-16 10:37:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala map


    【解决方案1】:

    只要您不介意从已删除的信息中创建一个集合,您就可以使用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))
    

    【讨论】:

    • 谢谢,这是最适合我想要实现的 - partition() 原始地图,将第二个元组元素(谓词失败的部分)分配给我想要的地图过滤器,并使用第一个元组元素检查删除了多少元素。
    【解决方案2】:

    如果您只想知道是否只删除了一个条目,那么您可以使用 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
    

    【讨论】:

    • 这对我来说还不够,因为我还想看看删除了哪些元素,尤其是。在多个元素被删除的情况下(我希望只有一个被删除的元素)。
    【解决方案3】:

    在映射值上考虑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))
    

    【讨论】:

    • 这对我也有用。由于“分区”技巧的答案首先出现,这是我使用的方法,但“分组依据”也适合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多