dob*_*eis 8 sorting smalltalk visualworks sortedcollection
如何在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 ] ]
Run Code Online (Sandbox Code Playgroud)
我们的想法是,如果项目a 在项目之前排序,则排序块应该回答为真b.与两个键来考虑,项目排序之前的另一项目如果任其主键(age)是更小,或主键是相同的,并且所述次级键(name)是以下.
这直接转换为上面的代码,并且可以容易地扩展到第三或更多排序标准(例如,二级密钥更少,或者它是相同的并且三级密钥更少).
people sort: [ :a :b |
a age = b age
ifTrue: [ a name < b name ]
ifFalse: [ a age < b age ] ]
Run Code Online (Sandbox Code Playgroud)
Randy说的是,但它集成在VisualWorks 7.8中,语法是aCollection asSortedCollection:#age ascending,#name descending
您还可以使用sort:或其他任何需要sortBlock的东西.