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

Имеет ли Scala какие-либо коллекции, сортирующие по значению вместо ключа?

Например, следующий код создает порядок Stock1, Stock2, Stock3

var tm = TreeMap("Stock1" -> 4.2, "Stock3" -> 3.7, "Stock2" -> 5.9)

Я ищу коллекцию или технику, которая может создавать следующие

Stock2, Stock1, Stock3, который представляет цены в убывающем порядке

4b9b3361

Ответ 1

scala> val sorted1 = tm.toList.sortBy (_._2)                                                           
sorted1: List[(java.lang.String, Double)] = List((Stock3,3.7), (Stock1,4.2), (Stock2,5.9))

scala> val sorted2 = tm.toList.sortBy (_._1)
sorted2: List[(java.lang.String, Double)] = List((Stock1,4.2), (Stock2,5.9), (Stock3,3.7))

Отмените сортировку1, чтобы она опустилась, или sortWith:

scala> val sorted3 = tm.toList.sortWith (_._2 > _._2) 
sorted3: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7))

Версия 4, сортировка по -x (минус x):

scala> val sorted4 = tm.toList.sortBy (-_._2)   
sorted4: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7))

Ответ 2

Я не думаю, что есть встроенная коллекция, которая сохраняет карту, отсортированную по значению, чтобы вы могли считывать отсортированные значения в линейном времени, но как сортировать scala.collection.Map [java.lang.String, Int] по его значениям? показывает способы, чтобы сортировать записи по значению.

Ответ 3

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

Рассмотрим, например, a LinkedHashMap, отсортированный по значению. Он находит ключ через хэш-таблицу и выполняет итерацию с использованием связанного списка. К сожалению, для этого требуется установка O(n), потому что она должна итерации через список, чтобы найти ключ.

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

Итак, почему бы просто не отсортировать элементы карты?

tm.toSeq.sorted(Ordering by ((_: (String, Double))._2))

Ответ 4

Если ваш набор данных более сложный, чем строгие пары ключ-значение:

Здесь есть библиотека набора java-данных, которую вы можете использовать для сортировки набора данных любым полем, представленным в этом наборе данных. Его простой в использовании и чрезвычайно гибкий.

http://casperdatasets.googlecode.com