从概念上讲,NSDictionary 是未排序的,正如 C0deH4cker 已经说过的那样。
如果您需要订单,您可以将键写入数组(但在从字典中删除键后,数组保留它可能会遇到问题,但是有教程如何使用CFArray)或NSSortedSet。
或者你可以继承 NSDictionary——这不是很简单,因为 NSDictionary 是一个类集群。但幸运的是,Matt 在他精彩的博文“OrderedDictionary: Subclassing a Cocoa class cluster”中展示了如何使用一个小技巧,即覆盖的has-a关系。
请注意,您的代码
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ( first < second ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( first > second ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}];
当您将 C 运算符应用于对象时,不会做您希望它做的事情。现在他们的指针将被排序。
它应该是这样的
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
return [first compare:second];
}];
或者,如果您想订购标量,即作为对象的包装器(即 NSNumber)
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ([first integerValue] > [second integerValue])
return (NSComparisonResult)NSOrderedDescending;
if ([first integerValue] < [second integerValue])
return (NSComparisonResult)NSOrderedAscending;
return (NSComparisonResult)NSOrderedSame;
}];