按字典值将NSDictionary键排序到NSArray中
我已经看过很多按键排序字典的例子,然后获取值,但是我如何按值排序。
例如
{ blue:12; red:50; white:44; }
我希望这些按数字降序排列为:
{ red:50; white:44; blue:12 }
我尝试获取一个排序的密钥nsarray,我可以从中创建有序的nsarray但结果仍然看起来无序。
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { if ( first second ) { return (NSComparisonResult)NSOrderedDescending; } else { return (NSComparisonResult)NSOrderedSame; } }];
从概念上讲,NSDictionary是未分类的,正如C0deH4cker已经说过的那样。
如果您需要订单,您可以将密钥写入数组(但是在从字典中删除密钥之后,您可能会遇到保留它的数组的问题,但有教程如何使用以下方法创建非保留数组CFArray )或NSSortedSet 。
或者你可以inheritanceNSDictionary – 不是很简单,因为NSDictionary是一个类集群。 但幸运的是,Matt在他的精彩博文中展示了“OrderedDictionary:Subclassing Cocoa类集群”如何使用一个小技巧,一个覆盖的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; }];
根据定义,字典是无序的。 可以使用哈希表来访问它们以获得速度。 您能够“订购”它的唯一方法是选择不同的数据类型。 韧皮数据类型取决于您的意图。
或者您可以直接对NSString键进行排序,如:
NSArray* sortedKeys = [sortedKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSNumber *A = @([obj1 LongValue]); NSNumber *B = @([obj2 LongValue]); return [A compare:B]; } ];