ios - 对 nsdictionary 进行排序,它是如何工作的?

标签 ios objective-c nsdictionary

我在理解这个 compare-using-selector 背后的逻辑时遇到了一些麻烦。

我有以下代码,我正在尝试提取键并同时对它们进行排序。但是,它不排序。无论我做什么,NSArray 的输出顺序都不会改变。

NSMutableDictionary *dictToSort = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Joe", [NSNumber numberWithInt:2], @"mark", [NSNumber numberWithInt:1], @"mdark", [NSNumber numberWithInt:3], nil];

NSArray *dictToSortKeys = [dictToSort keysSortedByValueUsingSelector:@selector(compare:)];

NSLog(@"Not Sorted" );

NSNumber *xx = dictToSortKeys[0];
NSNumber *xy = dictToSortKeys[1];
NSNumber *xz = dictToSortKeys[2];
NSLog(@"Sorted %d %d %d", xx.integerValue , xy.integerValue, xz.integerValue);

我不明白这个 compare: 函数是如何工作的。它说它返回 NSOrderedAscending、NSOrderedSame 或 NSOrderedDescending,但没有办法接收这些返回值。而且,这应该神奇地起作用?这个比较的文档很差。

最佳答案

我认为您对 keysSortedByValueUsingSelector: 的作用感到困惑。它按 对字典条目进行排序,并按该顺序返回键。

您的字典包含这些条目:

Key Value
--- -----
 1  mark
 2  Joe
 3  mdark

keysSortedByValueUsingSelector: 方法有效地按“值”列对该表进行排序:

Key Value
--- -----
 2  Joe
 1  mark
 3  mdark

(请注意,Joe 按字母顺序在 mark 之前,而 mark 按字母顺序在 mdark 之前。)

然后它按照刚刚计算的顺序返回一个键数组:@[ @2, @1, @3 ]

请注意,keysSortedByValueUsingSelector: 从不比较键。它比较值。

如果你想通过键本身对键数组进行排序,只需这样做:

NSArray *dictToSortKeys = [dictToSort.allKeys
    sortedArrayUsingSelector:@selector(compare:)];

关于ios - 对 nsdictionary 进行排序,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257582/

相关文章:

ios - AFJSONResponseSerializer 后 JSON NSDictionary 困惑

ios - UIViewController 中的 tableHeaderView

ios - 脚本动画 block iOS

ios - 水平滚动时 ScrollView 的默认方法是什么?

iphone - 在控制台中得到奇怪的打印语句

objective-c - For 循环中的奇怪错误

objective-c - 如何将 C 样式数组发送到 objective-c 方法

objective-c - 如何将 UIImage 存储在 NSDictionary 中?

ios - 如何在 iPhone 中隐藏/显示带动画的 UIView

iphone - 循环遍历 NSDictionary 以创建单独的 NSArrays