如何在Cincom VisualWorks中按兩個條件對集合進行排序?Smalltalk:按照兩個標準對集合進行排序
例子:我有一個包含個人的OrderedCollection,並希望新的集合,該人按年齡排序第一,然後如果年齡的人的名字相同的排序。
希望你能理解我的英文!謝謝..
如何在Cincom VisualWorks中按兩個條件對集合進行排序?Smalltalk:按照兩個標準對集合進行排序
例子:我有一個包含個人的OrderedCollection,並希望新的集合,該人按年齡排序第一,然後如果年齡的人的名字相同的排序。
希望你能理解我的英文!謝謝..
肖恩的代碼是好的,但我更喜歡這樣寫,這是更用心-revealing及略微更高效:
people sort: [ :a :b |
a age < b age
or: [a age = b age and: [ a name < b name ] ]
的想法是,排序塊應該回答真,如果項目各種各樣之前a
項目b
。與兩個鍵來考慮,前一個項目排序的另一項目如果任其主鍵(age
)較少,或主鍵是相同的,並且二級密鑰(name
)較少。
這直接轉化爲上面的代碼,並且可以被容易地擴展到三分之一或多種排序標準(例如,任一二級密鑰是更小,或它是相同的,第三密鑰是以下)。
people sort: [ :a :b |
a age = b age
ifTrue: [ a name < b name ]
ifFalse: [ a age < b age ] ]
Travis Griggs實現了一種以更簡潔的方式進行這種排序的有趣方式。他在Cincom Public Repository中發佈了他的作品TAG-SortFunctions,並且我相信它已經集成到VisualWorks的下一個版本中。有關詳細信息,請參閱his blog post on the topic和the followup。使用這個包,你就簡單的寫像這樣(未經):
人排序:#age sortUp,#NAME sortUp
,隨着艾倫說很酷 –
,這是集成在VisualWorks中7.8,但API改變。而不是#sortUp和#sortDown,你需要使用#ascending和#descending!您也可以將這兩個選擇器發送到塊而不是符號,如在「[:each | each address city] ascending」中所示。 – Karsten
什麼蘭迪說,但它集成在VisualWorks中7.8,和語法將 aCollection asSortedCollection:#age升,降#NAME
,你也可以使用排序:,或其他任何將採取一個sortBlock。
我更喜歡這種方式:) –