2011-11-20 91 views
8

如何在Cincom VisualWorks中按兩個條件對集合進行排序?Smalltalk:按照兩個標準對集合進行排序

例子:我有一個包含個人的OrderedCollection,並希望新的集合,該人按年齡排序第一,然後如果年齡的人的名字相同的排序。

希望你能理解我的英文!謝謝..

回答

8

肖恩的代碼是好的,但我更喜歡這樣寫,這是更用心-revealing及略微更高效:

people sort: [ :a :b | 
    a age < b age 
     or: [a age = b age and: [ a name < b name ] ] 

的想法是,排序塊應該回答真,如果項目各種各樣之前a項目b。與兩個鍵來考慮,前一個項目排序的另一項目如果其主鍵(age)較少,主鍵是相同的,並且二級密鑰(name)較少。

這直接轉化爲上面的代碼,並且可以被容易地擴展到三分之一或多種排序標準(例如,任一二級密鑰是更小,或它是相同的,第三密鑰是以下)。

+0

我更喜歡這種方式:) –

7
people sort: [ :a :b | 
    a age = b age 
     ifTrue: [ a name < b name ] 
     ifFalse: [ a age < b age ] ] 
9

Travis Griggs實現了一種以更簡潔的方式進行這種排序的有趣方式。他在Cincom Public Repository中發佈了他的作品TAG-SortFunctions,並且我相信它已經集成到VisualWorks的下一個版本中。有關詳細信息,請參閱his blog post on the topicthe followup。使用這個包,你就簡單的寫像這樣(未經):

人排序:#age sortUp,#NAME sortUp

+0

,隨着艾倫說很酷 –

+0

,這是集成在VisualWorks中7.8,但API改變。而不是#sortUp和#sortDown,你需要使用#ascending和#descending!您也可以將這兩個選擇器發送到塊而不是符號,如在「[:each | each address city] ascending」中所示。 – Karsten

6

什麼蘭迪說,但它集成在VisualWorks中7.8,和語法將 aCollection asSortedCollection:#age升,降#NAME

,你也可以使用排序:,或其他任何將採取一個sortBlock。

相關問題