Список кортежей фильтрации Scala

Вопрос . Как вы фильтруете на основе других элементов в списке?

У меня есть список, который выглядит так

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

Я хочу сохранить кортежи, которые получили самые большие вторые числа, когда они получили одинаковые первые

так что-то подобное на выходе

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

с удаленным (2,1), потому что 1 было ‹, а затем 2 в (2,2)

поэтому мне нужно фильтровать на основе других объектов в списке, как вы это делаете.

Эффективность не очень важна, так как список содержит максимум 171 элемент


person pastjean    schedule 19.12.2010    source источник


Ответы (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
person axel22    schedule 19.12.2010
comment
вы совершенно уверены во втором примере? groupBy вернет Map[Int, (Int, Int)] - person Kevin Wright; 20.12.2010
comment
Когда-нибудь я перестану удивляться, что люди предпочли бы предположить, чем вставить строку в repl. - person psp; 20.12.2010
comment
импровизированный народ! То же самое касается фактического тестирования ответа, прежде чем вы его примете... - person Kevin Wright; 20.12.2010
comment
lst.groupBy(_._1) возвращает scala.collection.immutable.Map[Int,scala.collection.immutable.IndexedSeq[(Int, Int)]], а не Map[Int, (Int, Int)]. Я пробовал оба в ответе, прежде чем ответить. Я что-то упускаю? - person axel22; 20.12.2010
comment
Ааа, нет... Я вижу, к чему ты клонишь. Группировка, а затем удаление ключей с карты — сохранение только максимального значения для каждого ключа. Вручную делать то, что .sorted.toMap все равно делает, но все равно довольно изящно. - person Kevin Wright; 20.12.2010
comment
Да, я согласен, решение .sorted.toMap намного элегантнее. Мне не приходило в голову полагаться на семантику Map сохранения последнего ключа. - person axel22; 20.12.2010
comment
Тем не менее, жестоко де-кейинг такой карты. Это смелый подход, и, безусловно, его стоит запомнить. - person Kevin Wright; 20.12.2010
comment
Не проявляй милосердия к своим картам. :D - person axel22; 20.12.2010

Преобразование списка пар в карту будет использовать последнюю встречающуюся запись, когда данный «ключ» встречается дважды.

И кортеж сортируется по первому элементу, затем по второму элементу и т. д.

So:

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

Просто преобразуйте обратно в список с .toList впоследствии, если это необходимо

person Kevin Wright    schedule 19.12.2010