2012-07-19 87 views
10

好吧,我知道字典無法排序。但是,假設我有NSMutableArray *keys = [someDictionary allKeys];現在,我想根據字典中的相應值(按字母順序)對這些鍵進行排序。所以如果字典包含key=someString,那麼我想根據它們對應的字符串對keys進行排序。我認爲它的一些應用sortUsingComparator,但在這一點上我有一點點的不足。Objective-C:基於字典條目對NSDictionary的鍵進行排序

回答

18
NSArray *keys = [someDictionary allKeys]; 
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    NSString *first = [someDictionary objectForKey:a]; 
    NSString *second = [someDictionary objectForKey:b]; 
    return [first compare:second]; 
}]; 
+0

既不'keys'也不'sortedKeys'這裏是一個可變字典,它們是不可變的。 – 2012-07-19 06:20:09

+0

ops你的意思是一個可變的數組?我只是從問題ha – mask8 2012-07-19 06:24:16

+0

複製粘貼,是的,我的意思是可變數組。 – 2012-07-19 07:02:23

3
NSDictionary *dict = // however you obtain the dictionary 
NSMutableArray *sortedKeys = [NSMutableArray array]; 

NSArray *objs = [dict allValues]; 
NSArray *sortedObjs = [objs sortedArrayUsingSelector:@selector(compare:)]; 
for (NSString *s in sortedObjs) 
    [sortedKeys addObjectsFromArray:[dict allKeysForObject:s]]; 

現在sortedKey將包含按其對應的對象排序的鍵。

+0

如果它不只是關鍵的價值。如果每個鍵都對應一個字典,而我想按該字典中的「名稱」鍵進行排序呢?對不起,我應該在OP中提到這一點。謝謝您的幫助! – JoshDG 2012-07-19 06:20:37

+0

它總是*是*「只是」鍵值,因爲這就是NSDictionary的用途。你的意思是非標量值 - 在這種情況下,你需要將它作爲函數並應用遞歸。 – 2012-07-19 06:23:04

+0

從性能角度來看,這不是非常聰明,在某些情況下不會返回正確的結果。 – Sven 2012-07-19 06:51:07

1

只是把它寫在這裏,因爲我沒有在任何地方找到它:爲了得到一個字母基於價值排序的NSDictionary從一個NSDictionary回來 - 這在我的情況是neccessary - 你可以做到以下幾點:

//sort typeDict alphanumeric to show it in order of values 
    NSArray *keys = [typeDict allKeys]; 

    NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *first = [typeDict objectForKey:a]; 
     NSString *second = [typeDict objectForKey:b]; 
     return [first compare:second]; 
    }]; 
    NSLog(@"sorted Array: %@", sortedKeys); 

    NSMutableDictionary *sortedTypeDict = [NSMutableDictionary dictionary]; 
    int counter = 0; 
    for(int i=0; i < [typeDict count]; i++){ 
     NSString *val = [typeDict objectForKey:[sortedKeys objectAtIndex:counter]]; 
     NSString *thekey = [sortedKeys objectAtIndex:counter]; 
     [sortedTypeDict setObject:val forKey:thekey]; 
     counter++; 
    } 
    NSLog(@"\n\nsorted dict: %@", sortedTypeDict); 

沒什麼大不了的!基於字典的NSDictionary的

+0

正在尋找這個,謝謝! – 2015-07-16 23:27:40

2

排序鍵

的Abobe被用於返回一個排序後的數組基於字典的內容,這是用於返回由字典鍵排序陣列

NSArray *keys = [theDictionary allKeys]; 
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    return [a compare:b]; 
}]; 
NSMutableArray *sortedValues = [NSMutableArray new]; 
for(NSString *key in sortedKeys) 
    [sortedValues addObject:[dictFilterValues objectForKey:key]]; 
相關問題