Подтвердить что ты не робот

Scala сортировка карт

Как сортировать карту такого типа:

"01" -> List(34,12,14,23), "11" -> List(22,11,34)

по начальным значениям?

4b9b3361

Ответ 1

Один из способов - использовать scala.collection.immutable.TreeMap, который всегда сортируется по клавишам:

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))

//If  you have already a map...
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
//... use this
val t = TreeMap(m.toSeq:_*)

Вы можете преобразовать его в Seq или List и отсортировать его:

//by specifying an element for sorting
m.toSeq.sortBy(_._1) //sort by comparing keys
m.toSeq.sortBy(_._2) //sort by comparing values

//by providing a sort function
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys

Существует множество возможностей, каждый из которых более или менее удобен в определенном контексте.

Ответ 2

Как указано, тип Map по умолчанию не сортируется, но всегда SortedMap

import collection.immutable.SortedMap
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))

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

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted
//or
val sorted = SortedMap(unsorted.toSeq:_*)

Или, если вы не привязаны к интерфейсу Map, вы можете просто преобразовать его в последовательность кортежей. Обратите внимание, что этот подход будет работать, только если оба ключа и значения имеют определенный порядок. В списках не указано задание по умолчанию, поэтому это не будет работать с вашим примером кода. Поэтому я составил несколько других чисел.

val unsorted = Map("01" -> 56, "11" -> 34)
val sorted = unsorted.toSeq.sorted

Это может быть полезно, если вы можете сначала преобразовать свои списки в какой-то другой тип (например, String), который лучше всего использовать с помощью mapValues

update: См. ответ Landei, в котором показано, как вы можете предоставить пользовательскую функцию сортировки, которая заставит этот подход работать.