如何在Cincom VisualWorks中按两个条件对集合进行排序?
示例:我有一个包含人的OrderedCollection,并且想要一个新的集合,按年龄对人进行排序,然后如果年龄与人名相同,则按名称排序。
希望你能理解我的英语!感谢..
答案 0 :(得分:9)
Travis Griggs实现了一种有趣的方式,以更加简洁的方式进行此类排序。他在Cincom公共存储库中将他的工作发布为TAG-SortFunctions,我相信它已经集成到VisualWorks的下一个版本中。有关详细信息,请参阅his blog post on the topic和the 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的内容。