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

时间:2011-11-20 21:21:20

标签: sorting smalltalk visualworks sortedcollection

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

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

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

4 个答案:

答案 0 :(得分:9)

Travis Griggs实现了一种有趣的方式,以更加简洁的方式进行此类排序。他在Cincom公共存储库中将他的工作发布为TAG-SortFunctions,我相信它已经集成到VisualWorks的下一个版本中。有关详细信息,请参阅his blog post on the topicthe followup。使用这个包,您只需编写类似这样的内容(未经测试):

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

答案 1 :(得分:8)

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

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

如果项目a 排序项目b,则排序块应该回答为真。如果 其主键(age)更少,主键相同,则需要考虑两个键,其中一个项目在另一个项目之前排序,< strong>和辅助密钥(name)更少。

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

答案 2 :(得分:7)

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

答案 3 :(得分:6)

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

您还可以使用sort:或其他任何需要sortBlock的内容。