Smalltalk:按两个标准对集合进行排序

dob*_*eis 8 sorting smalltalk visualworks sortedcollection

如何在Cincom VisualWorks中按两个条件对集合进行排序?

示例:我有一个包含人员的OrderedCollection,并且想要一个新的集合,该集合首先按年龄对人员进行排序,然后如果年龄与人名相同.

希望你能理解我的英语!谢谢..

Ran*_*man 9

Travis Griggs采用了一种有趣的方式,以更加简洁的方式进行这种排序.他在Cincom公共存储库中将他的工作发布为TAG-SortFunctions,我相信它已经集成到VisualWorks的下一个版本中.有关详细信息,请参阅有关该主题的博客文章后续内容.使用这个包,你只需要写这样的东西(未经测试):

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


Ber*_*erg 8

Sean的代码很好,但我更喜欢用这种方式编写,这更有意思,更有效:

people sort: [ :a :b |
    a age < b age
        or: [a age = b age and: [ a name < b name ] ]
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果项目a 项目之前排序,则排序块应该回答为真b.与两个键来考虑,项目排序之前的另一项目如果其主键(age)是更小,主键是相同的,并且所述次级键(name)是以下.

这直接转换为上面的代码,并且可以容易地扩展到第三或更多排序标准(例如,二级密钥更少,或者它是相同的并且三级密钥更少).


Sea*_*ris 7

people sort: [ :a :b |
    a age = b age
        ifTrue: [ a name < b name ]
        ifFalse: [ a age < b age ] ]
Run Code Online (Sandbox Code Playgroud)


Ala*_*ght 6

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

您还可以使用sort:或其他任何需要sortBlock的东西.