我有一个这样的词典:
a PluggableDictionary(
Rankable1->8.5
Rankable2->9.0
)
我只需要一个OrderedCollection,其Rankable对象按降序排列:
a OrderedCollection(
Rankable2
Rankable1
)
我注意到按键排序很容易,但我发现按值排序有点困难。这样做的小方法是什么?
答案 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]