objective-c - 按字典值将 NSDictionary 键排序为 NSArray

标签 objective-c ios

我看过很多按键对字典进行排序然后获取值的示例,但我该如何改为按值排序。

例如

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

  }];

最佳答案

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

如果您需要一个订单,您可以将键写入一个数组(但是当键从字典中删除后,您可能无法让数组保留它,但是有教程如何创建一个 un-retaining array by using the CFArray )或 NSSortedSet .

或者你可以将 NSDictionary 子类化——这不是很简单,因为 NSDictionary 是一个类簇。但幸运的是,马特在他精彩的博文中展示了 "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/

相关文章:

iphone - 在 UItableview 上方添加内容

ios - 为什么在设备上运行时数据会被破坏,而在模拟器上不会?

ios - 如何在 segue 中初始化 UIButton 的 titleLabel 字体?

ios - IBOutlet 未在 SWIFT 中连接

objective-c - 你能阻止人们在 iPad 1 上使用你的应用程序吗?

ios - 更改警报 View 可见时按主页按钮的默认行为

ios - 如何为所有 push segues 设置符号断点?

objective-c - ALAssetPropertyDate 返回 "wrong"日期

ios - 从没有 Controller 的 UITableView 触发 segue

ios - 防止使用具有较低部署目标的 SDK 在 App 上构建