0

我在理解这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,但没有办法接收这些返回。而且,这应该可以神奇地工作吗?对于这个比较的东西,文档很差。

4

1 回答 1

8

我认为你对做什么感到困惑keysSortedByValueUsingSelector:它按value对字典条目进行排序,并按该顺序返回键。

您的字典包含以下条目:

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:)];
于 2013-06-23T04:09:01.037 回答