Как отсортировать словарь по значениям в Smalltalk? - PullRequest
4 голосов
/ 16 марта 2012

У меня есть словарь, подобный этому:

a PluggableDictionary(
    Rankable1->8.5
    Rankable2->9.0
)

Мне нужна просто OrderedCollection с объектами Rankable в порядке убывания:

a OrderedCollection(
    Rankable2
    Rankable1
)

Я заметил, что это легко сортироватьпо ключам, но мне было немного сложнее сортировать по значениям.Что такое способ разговора?

Ответы [ 4 ]

5 голосов
/ 16 марта 2012

Если вам нужна одна отсортированная коллекция в некритическом цикле, вы можете использовать что-то вроде этого (использует синтаксис pharo для инициализации примера словаря):

pd := PluggableDictionary newFromPairs: { 'a' . 2 . 'b' . 1 . 'c' . 3} . 

(pd associations asSortedCollection: [:x :y | x value < y value]) 
            collect: [:assoc | assoc key].

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

2 голосов
/ 17 марта 2012

Если вы можете использовать Grease (например, при использовании Seaside), вы, вероятно, можете использовать его GROrderedMultiMap.Он предназначен для небольших словарей с, вероятно, несколькими значениями на ключ.

Во второй заметке, вероятно, вы можете поменять ключ и значение и просто отправить #asSortedCollection, например:

(Dictionary newFrom: { 2 -> 'b' . 1-> 'a' }) 
    asSortedCollection "-->  a SortedCollection('a' 'b')"

(Проверено в Squeak и Pharo)

2 голосов
/ 17 марта 2012

Если вы используете VisualWorks, вы можете воспользоваться поведением SortFunction и Symbol >> value, чтобы уменьшить все это до

(aDictionary associations sort: #value ascending) collect: #key
1 голос
/ 16 марта 2012

Понял:

^ ((SortedCollection sortBlock: 
   [:association :otherAssociation | association value > otherAssociation value])
   addAll: theDictionary associations;
   yourself) collect: [:association | association key]
...