按字典值将NSDictionary键排序为NSArray

Mon*_*key 8 objective-c ios

我已经看过很多按键排序字典的例子,然后获取值,但我如何按值排序.

例如

{
blue:12;
red:50;
white:44;
}
Run Code Online (Sandbox Code Playgroud)

我希望这些按数字降序排列为:

{
red:50;
white:44;
blue:12
}
Run Code Online (Sandbox Code Playgroud)

我尝试获取一个排序的密钥nsarray,我可以从中创建有序的nsarray但结果仍然看起来无序.

  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;
    }

  }];
Run Code Online (Sandbox Code Playgroud)

Vik*_*ica 10

从概念上讲,NSDictionary是未分类的,正如C0deH4cker已经说过的那样.

如果您需要的订单,您可以按键写入到阵列(但你可能有阵列保持它的关键是从字典中删除后的麻烦,但有教程如何创建一个使用非保留阵列CFArray)或NSSortedSet.

或者你可以继承NSDictionary - 不是很简单,因为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;
    }

  }];
Run Code Online (Sandbox Code Playgroud)

不要做,你想要它做什么,因为你正在将C运算符应用于对象.现在他们的指针将被订购.

应该是这样的

 NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
    return [first compare:second];
  }];
Run Code Online (Sandbox Code Playgroud)

或者如果你想在标量上订购,那就是包装作为对象(即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;
}];
Run Code Online (Sandbox Code Playgroud)