按字典值将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]; } ];