【发布时间】: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((2,2),(2,1),(3,1),....)
我想保留第二个数字最大的元组,因为它们的第一个数字相同
输出类似的东西
List((2,2),(3,1),...)
删除了 (2,1),因为 1 在 (2,2) 中是
所以我需要根据列表中的其他对象进行过滤,您如何做到这一点。
效率并不重要,因为列表最多包含 171 个项目
【问题讨论】:
当给定的“键”出现两次时,将一对列表转换为映射将使用最后出现的条目。
元组按第一个元素排序,然后是第二个元素,依此类推。
所以:
List((2,2),(2,1),(3,1)).sorted.toMap
// = List((2,1),(2,2),(3,1)).toMap
// = Map((2,2), (3,1))
如有必要,之后只需转换回带有.toList 的列表
【讨论】:
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
【讨论】:
lst.groupBy(_._1) 返回scala.collection.immutable.Map[Int,scala.collection.immutable.IndexedSeq[(Int, Int)]],而不是Map[Int, (Int, Int)]。在回答之前,我已经在 repl 中尝试了这两种方法。我错过了什么吗?