簡體   English   中英

Smalltalk:按兩個標准對集合進行排序

[英]Smalltalk: Sort a collection by two criteria

如何在Cincom VisualWorks中按兩個條件對集合進行排序?

示例:我有一個包含人員的OrderedCollection,並且想要一個新的集合,該集合首先按年齡對人員進行排序,然后如果年齡與人員名稱相同。

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

Travis Griggs采用了一種有趣的方式,以更加簡潔的方式進行這種排序。 他在Cincom公共存儲庫中將他的工作發布為TAG-SortFunctions,我相信它已經集成到VisualWorks的下一個版本中。 有關詳細信息,請參閱有關該主題的博客文章后續內容。 使用這個包,你只需要寫這樣的東西(未經測試):

人們排序:#age sortUp,#name sortUp

Sean的代碼很好,但我更喜歡用這種方式編寫,這更有意思,更有效:

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 ] ]

Randy說的是,但它集成在VisualWorks 7.8中,語法是aCollection asSortedCollection:#age ascending,#name descending

您還可以使用sort:或其他任何需要sortBlock的東西。

暫無
暫無

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

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