Есть ли в Scala коллекции, которые сортируют по значению, а не по ключу? - PullRequest
14 голосов
/ 07 августа 2011

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 07 августа 2011
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))
4 голосов
/ 08 августа 2011

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

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

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

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

tm.toSeq.sorted(Ordering by ((_: (String, Double))._2))
4 голосов
/ 07 августа 2011

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

2 голосов
/ 07 августа 2011

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

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

http://casperdatasets.googlecode.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...