8

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

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

希望你能听懂我的英文!谢谢..

4

4 回答 4

9

Travis Griggs以一种更简洁的方式实现了一种有趣的方式来进行这种排序。他将他的作品作为 TAG-SortFunctions 发布在 Cincom Public Repository 中,我相信它已经集成到 VisualWorks 的下一个版本中。有关详细信息,请参阅他有关该主题的博客文章后续内容。使用这个包,你可以简单地写这样的东西(未经测试):

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

于 2011-11-21T06:53:55.757 回答
9

肖恩的代码很好,但我更喜欢这样写,它更能表达意图,效率也更高:

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

这个想法是,如果 item在itema 之前b排序,排序块应该回答 true 。考虑到两个键,如果一个项目的主键 ( ) 较小,或者主键相同,辅助键 ( ) 较小则该项目排在另一个项目之前。agename

这直接转化为上面的代码,并且可以很容易地扩展到第三个或更多的排序标准(例如,二级键较少,或者相同而三级键较少)。

于 2011-11-21T10:05:33.397 回答
7
people sort: [ :a :b |
    a age = b age
        ifTrue: [ a name < b name ]
        ifFalse: [ a age < b age ] ]
于 2011-11-21T02:11:21.557 回答
6

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

你也可以使用 sort:,或者任何其他需要 sortBlock 的东西。

于 2011-11-21T13:21:52.113 回答