Cincom VisualWorksでコレクションを2つの基準で並べ替えるにはどうすればよいですか?
例:人物を含むOrderedCollectionがあり、最初に人物を年齢で並べ替え、次に年齢が同じ場合は名前で人物を並べ替える新しいコレクションが必要です。
あなたが私の英語を理解できることを願っています!ありがとう..
Cincom VisualWorksでコレクションを2つの基準で並べ替えるにはどうすればよいですか?
例:人物を含むOrderedCollectionがあり、最初に人物を年齢で並べ替え、次に年齢が同じ場合は名前で人物を並べ替える新しいコレクションが必要です。
あなたが私の英語を理解できることを願っています!ありがとう..
Travis Griggsは、この種の種類をはるかに簡潔な方法で実行する興味深い方法を実装しました。彼は自分の作品をTAG-SortFunctionsとしてCincomPublicRepositoryに公開しており、VisualWorksの次のリリースに統合されていると思います。詳細については、トピックとフォローアップに関する彼のブログ投稿を参照してください。このパッケージを使用すると、次のように記述できます(テストされていません)。
人の並べ替え:#age sortUp、#name sortUp
Sean のコードは問題ありませんが、私は次のように記述した方が好みです。これは、より意図が明確で、わずかに効率的です。
people sort: [ :a :b |
a age < b age
or: [a age = b age and: [ a name < b name ] ]
item がitemのa
前に並べ替えられる場合、並べ替えブロックは true に応答する必要があるという考えですb
。考慮すべき 2 つのキーがある場合、プライマリ キー ( ) が小さいか、プライマリ キーが同じでセカンダリキー ( ) が小さい場合、アイテムは別のアイテムの前に並べ替えられます。age
name
これは上記のコードに直接変換され、3 番目以上のソート基準に簡単に拡張できます (たとえば、2 番目のキーが少ない、または同じで 3 番目のキーが少ない)。
people sort: [ :a :b |
a age = b age
ifTrue: [ a name < b name ]
ifFalse: [ a age < b age ] ]
Randy が言ったことですが、これは VisualWorks 7.8 に統合されており、構文は aCollection asSortedCollection: #age 昇順、#name 降順になります。
ここでは、sort: など、sortBlock を使用するものを使用することもできます。