2010-12-19 104 views
4

問:如何基於列表中的其他項目進行過濾?Scala過濾元組列表

我有一個列表,看起來像

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

我想保持它得到了最大的第二個數字時,他們得到了相同的第一批

的tupples

這樣類似的東西輸出

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

與(2,1)中移除,因爲在1(2,2)

是<然後

所以我需要根據列表中的其他對象進行過濾如何做到這一點。

效率是不是真的很重要,因爲該名單得到了最大171項

回答

11
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

16

轉換對列表的地圖當給定的「鑰匙」出現兩次時將使用最後出現的入口。

而一個元組排序的第一個元素,那麼第二個元素等

等等:

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

只是轉換回列表與.toList之後,如果需要的話