簡體   English   中英

如何按Smalltalk中的值對字典進行排序?

[英]How to sort a Dictionary by values in Smalltalk?

我有一個像這樣的字典:

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

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

a OrderedCollection(
    Rankable2
    Rankable1
)

我注意到按鍵排序很容易,但我發現按值排序有點困難。 這樣做的小方法是什么?

如果你需要在非關鍵循環中使用一個鏡頭排序集合,你可能會使用這樣的東西(使用pharo語法來初始化示例字典):

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

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

如果您需要更頻繁地使用它,那么您可能會考慮引入自己的類來保持此集合的計算。

如果您正在使用VisualWorks,則可以利用SortFunction和Symbol >>值行為將所有這些減少到

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

如果你可以使用Grease(例如,當使用Seaside時),你可以使用它的GROrderedMultiMap 它適用於每個鍵可能有多個值的小詞典。

在第二個注釋,可能你可以交換鍵和值,只需發送#asSortedCollection ,如下所示:

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

(在Squeak和Pharo測試過)

得到它了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM