我已经看到了很多示例,这些示例按键对字典进行排序,然后获取值,但是我将如何按值对字典进行排序。

例如

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

  }];

最佳答案

正如C0deH4cker所说,NSDictionary在概念上是未排序的。

如果需要命令,则可以将键写入数组(但是在从字典中删除键之后,可能无法在数组上保留键,但是有教程介绍如何创建un-retaining array by using the 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;
}];

关于objective-c - 将NSDictionary键按字典值排序到一个NSArray中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11217421/

10-14 20:38
查看更多