2013-06-23 38 views
0

我在理解這個compare-using-selector背後的邏輯時遇到了一些麻煩。排序nsdictionary,它是如何工作的?

我有下面的代碼,我試圖提取鍵和排序他們在同一時間。但是,它不排序。無論我做什麼,輸出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,但是沒有辦法獲得這些回報。而且,這應該是神奇的工作?這個比較的文件很差。

回答

7

我認爲你對keysSortedByValueUsingSelector:做什麼感到困惑。它通過對字典條目進行排序,然後按照該順序返回鍵。

你的字典有這些項:

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

keysSortedByValueUsingSelector:方法有效的「值」列排序該表:

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

(注意Joe是按字母順序之前markmark是按字母順序在mdark之前。)

然後它返回一個密鑰數組,按剛剛計算的順序:@[ @2, @1, @3 ]

請注意,keysSortedByValueUsingSelector:永遠不會比較鍵。它只有比較值。

如果你想通過密鑰本身的關鍵數組進行排序,只是這樣做:

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

幹得好小夥子,偉大的答案。 + 1是個好人。:) –

+0

是的,就是這樣。好東西.. – mskw

+0

但是,我會如何扭轉秩序?編輯:我會使用conpare:選項。 – mskw