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

时间:2013-06-23 03:53:57

标签: 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 or NSOrderedDescending,但无法接收这些返回。而且,这应该神奇地工作?对于这种比较,文档很差。

1 个答案:

答案 0 :(得分:7)

我认为你对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:)];