Scala фильтрующий список кортежей - PullRequest
4 голосов
/ 20 декабря 2010

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

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

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

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

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

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

с удалением (2,1), потому что 1 был <затем 2 в (2,2) </p>

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

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

Ответы [ 2 ]

16 голосов
/ 20 декабря 2010

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

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

Итак:

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

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

11 голосов
/ 20 декабря 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...