按字典值将NSDictionary键排序为NSArray

时间:2012-06-26 23:36:22

标签: objective-c ios

我见过很多按键排序字典的例子,然后获取值,但我如何按值排序。

e.g。

{
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)NSOrderedAscending;
    } else if ( first > second ) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }

  }];

3 个答案:

答案 0 :(得分:10)

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

如果您需要订单,您可以将密钥写入数组(但是在从字典中删除密钥后,您可能会遇到阻止它的数组,但有教程如何创建{{3} })或un-retaining array by using the CFArray

或者你可以继承NSDictionary - 不是很简单,因为NSDictionary是一个类集群。但幸运的是,马特在他精彩的博文NSSortedSet中展示了如何使用一个小技巧,一个涵盖的有一个的关系。


请注意,您的代码

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

答案 1 :(得分:0)

根据定义,字典是无序的。可以使用哈希表来访问它们以获得速度。您能够“订购”它的唯一方法是选择不同的数据类型。韧皮数据类型取决于您的意图。

答案 2 :(得分:0)

或者您可以直接对NSString键进行排序,如:

NSArray* sortedKeys = [sortedKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id  _Nonnull obj2) {
        NSNumber *A = @([obj1 LongValue]);
        NSNumber *B = @([obj2 LongValue]);

        return [A compare:B];
    } ];