Почему scala .collection.Map не имеет методов сортировки? - PullRequest
0 голосов
/ 01 мая 2020

Существует ли какая-либо конкретная причина, по которой необходимо преобразовать Map в Seq для сортировки по ключам или значениям. Почему Scala не включил методы сортировки (например, sortBy, sortWith, sortByKey, sortByValue) в Map API? Даже конструкторам SortedMap или TreeMap необходимы последовательности для работы. Итак, программно:

val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
m.toSeq.sortBy(_._1) // this is the way to go
m.sortBy(_._1) // why couldn't this also be the way to go?

Пользователи карт уже работают с кортежами

m.foreach {
   entry: (String, List[Int]) => println(s"key:${entry._1},value:${entry._2}")
}

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

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

Это было бы возможно для Map.sortBy et c , возвращать SortedMap, но это не будет соответствовать эквивалентным методам для других типов коллекций.

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

0 голосов
/ 02 мая 2020

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

val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
implicit val mOrd: Ordering[String] = (s1, s2) => s1.toInt - s2.toInt
m.to(SortedMap) //return: TreeMap(01 -> List(34, 12, 14, 23), 11 -> List(22, 11, 34))

Обратите внимание, что этот Ordering[String] переопределит все упорядочения для строки в той же области. Вы также можете передать его явно как параметр, но он немного более подробный:

val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
m.to(SortedMap.sortedMapFactory(((s1,s2) => s1.toInt - s2.toInt): Ordering[String]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...