2012-07-19 81 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]]; 
相关问题