2012-03-16 9 views
4

私はこのような辞書を持っている:スモールトークで辞書を値でソートするには?

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

私は降順でRankableのオブジェクトとだけOrderedCollection必要があります。

a OrderedCollection(
    Rankable2 
    Rankable1 
) 

を私はキーでソートするのは簡単です気づいたが、私値でソートするのが少し難しいことがわかりました。これを行うためのスモールトークの方法は何ですか?

+0

私は、頼みます辞書?おそらく間違ったデータ構造を使用しています。 –

答えて

5

あなたは、重要でないループ内の1回のショット分別収集が必要な場合は、次のようなもの(例えば、辞書を初期化するためにファロ構文を使用しています)使用することがあります:あなたが希望した場合

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

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

をこのコレクションを計算したままにする独自のクラスを導入することを検討するよりも頻繁に必要になります。あなたはVisualWorksのを使用している場合

+0

ああ、私はメソッド 'asSortedCollection:'を知らなかった。明らかに、それはより読みやすい。ありがとう! PS: '<' –

1

はそれを手に入れた:

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

私は、より良い/より短い/より小さなsmalltalk-wayソリューションを受け入れます:) –

2

、あなたはグリースを使用することができる場合

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

にそのすべてをダウン減らすためにSortFunctionとシンボル>>値の挙動を利用することができます(例えば、シーサイドを使用した場合)、 はおそらくそのを使用できます。それはおそらくキーごとに複数の値を持つ小さな辞書を対象としています。二ノートで

、このように、おそらくあなたは、キーと値を入れ替えることができ、そしてちょうど#asSortedCollectionを送る:あなたはソートが必要な理由(スクイークとファロでテスト済み)

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

+0

の代わりに '>'にするか、または単に:(辞書newFrom:{2 - > 'b'。1 - > 'a'})ソートする –

関連する問題