【问题标题】:Scala filtering tuple listScala过滤元组列表
【发布时间】:2011-05-27 23:20:43
【问题描述】:

问题:如何根据列表中的其他项目进行过滤?

我有一个类似的列表

List((2,2),(2,1),(3,1),....)

我想保留第二个数字最大的元组,因为它们的第一个数字相同

输出类似的东西

List((2,2),(3,1),...)

删除了 (2,1),因为 1 在 (2,2) 中是

所以我需要根据列表中的其他对象进行过滤,您如何做到这一点。

效率并不重要,因为列表最多包含 171 个项目

【问题讨论】:

    标签: list scala filter tuples


    【解决方案1】:

    当给定的“键”出现两次时,将一对列表转换为映射将使用最后出现的条目。

    元组按第一个元素排序,然后是第二个元素,依此类推。

    所以:

    List((2,2),(2,1),(3,1)).sorted.toMap
    // = List((2,1),(2,2),(3,1)).toMap
    // = Map((2,2), (3,1))
    

    如有必要,之后只需转换回带有.toList 的列表

    【讨论】:

      【解决方案2】:
      for ((x, y) <- lst if !lst.exists(t => x == t._1 && y < t._2)) yield (x, y)
      

      但如果你想要非二次复杂度:

      lst.groupBy(_._1).map(_._2.max).toList.sorted
      

      【讨论】:

      • 相当确定第二个例子吗? groupBy 将返回一个 Map[Int, (Int, Int)]
      • 总有一天我会不再感到惊讶,人们宁愿胡乱猜测也不愿在 repl 中粘贴一行。
      • extempore 是对的人!在您接受答案之前实际测试答案也是如此......
      • lst.groupBy(_._1) 返回scala.collection.immutable.Map[Int,scala.collection.immutable.IndexedSeq[(Int, Int)]],而不是Map[Int, (Int, Int)]。在回答之前,我已经在 repl 中尝试了这两种方法。我错过了什么吗?
      • 对你的地图毫不留情。 :D
      猜你喜欢
      • 2016-11-15
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多