2013-05-05 2 views
3

У меня есть карта ...Преобразовать карту в отсортированный список

Map(a -> List(a, a), b -> List(b, b), l -> List(l, l)) 

можно преобразовать в список

List((a,2), (l,2), (b,2)) 

Просто делать myMap.toList();

Но я хотел бы преобразовать в отсортированный список - который отсортирован по первому элементу кортежа?

Любые советы?

Благодаря

+0

Вы не можете сначала преобразовать карту в отсортированную карту? –

ответ

10

Быстрое решение: myMap.toList.sortBy(_._1).

Это эквивалентно myMap.toList.sortBy(tuple => tuple._1). _1 получает первый элемент из кортежа.

sortBy в общем случае выполняет функцию, которая отображает отсортированные элементы в какое-то значение, и это значение будет использоваться для сравнения отсортированных элементов.

Вы также можете написать это более пространно, как это: myMap.toList.sortBy {case (key, _) => key}

+0

Как насчет эффективности того, что ты превращаешь в список, а затем проходишь через каждый элемент в списке? –

+0

Можете ли вы объяснить, что означает короткий _._ 1? Является ли это для каждого элемента сравнения первым элементом в кортеже? –

+0

@MoreThanFive Если вы хотите использовать 'List', который является неизменным, то я не вижу, как это может быть более эффективным (с точки зрения сложности и объема копирования). – ghik

0

В зависимости от вашего случая использования, это может быть целесообразно использовать упорядоченную коллекцию, в первую очередь.

A TreeMap is SortedMap - он хранит подборку, отсортированную по мере вставки/удаления значений, обеспечивая логарифмический поиск/вставку. Если операция сортировки происходит часто по отношению к вставке/удалению, может стоить торговать от операций с постоянным временем, чтобы иметь дешевый доступ к отсортированным результатам.

A ListMap - это структура на основе списка. Поиск/вставка ужасно неэффективны, но это может быть подходящим выбором, если эти операции происходят относительно редко. Вам придется сортировать список всякий раз, когда вы вставляете пары.

Смежные вопросы