Scala过滤元组列表

问题描述:

问:如何基于列表中的其他项目进行过滤?Scala过滤元组列表

我有一个列表,看起来像

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

我想保持它得到了最大的第二个数字时,他们得到了相同的第一批

的tupples

这样类似的东西输出

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

与(2,1)中移除,因为在1(2,2)

是<然后

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

效率是不是真的很重要,因为该名单得到了最大171项

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 
+0

感谢,不知道关于groupby – pastjean 2010-12-19 21:56:05

+0

你是否确信第二个例子? groupBy将返回一个Map [Int,(Int,Int)] – 2010-12-19 22:43:08

+3

有一天,我会停止被惊讶的人宁愿采取一个疯狂的猜测,而不是将一行粘贴到repl。 – extempore 2010-12-20 06:24:30

转换对列表的地图当给定的“钥匙”出现两次时将使用最后出现的入口。

而一个元组排序的第一个元素,那么第二个元素等

等等:

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

只是转换回列表与.toList之后,如果需要的话