如何按Smalltalk中的值对字典进行排序?

时间:2012-03-16 03:14:03

标签: dictionary smalltalk pharo

我有一个这样的词典:

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

我只需要一个OrderedCollection,其Rankable对象按降序排列:

a OrderedCollection(
    Rankable2
    Rankable1
)

我注意到按键排序很容易,但我发现按值排序有点困难。这样做的小方法是什么?

4 个答案:

答案 0 :(得分:5)

如果你需要在非关键循环中使用一个镜头排序集合,你可以使用这样的东西(使用pharo语法来初始化示例字典):

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

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

如果您需要更频繁地使用它,那么您可能会考虑引入自己的类,以便计算此集合。

答案 1 :(得分:2)

如果您正在使用VisualWorks,您可以利用SortFunction和Symbol&gt;&gt;值行为将所有这些减少到

(aDictionary associations sort: #value ascending) collect: #key

答案 2 :(得分:2)

如果你可以使用Grease(例如,使用Seaside时),你可以 可能使用它的GROrderedMultiMap。它适用于每个键可能有多个值的小词典。

在第二个注释中,您可以交换键和值,然后发送#asSortedCollection,如下所示:

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

(在Squeak和Pharo中测试)

答案 3 :(得分:1)

知道了:

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