通过内部字典中的键对字典进行排序

时间:2014-03-07 23:13:24

标签: objective-c sorting nsdictionary

我有一本字典,我想根据内部字典中的键对其进行排序。超级字典中的每个键都有一个字典作为值。作为一个例子来说明我在说什么,这里是一个超级字典,分别为每个键提供内部字典。

{
    key1 = {count = 2}, 
    key2 = {count = 1}
}
因此,计数键必须是用于排序的键。现在我只知道如何排序数组,我之前没有遇到排序字典。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

从字典中获取数组&排序

NSArray* values = [myDict allValues];
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)];

另一种方法来制作NSSortDescriptor

keyDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:YES] autorelease];
sortDescriptors = [NSArray arrayWithObject:keyDescriptor];
sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

我从Sort Descriptor Programming Topics提取代码。此外,Key-Value Coding开始发挥作用,sortedArrayUsingDescriptors:会向valueForKey:中的每个元素发送myArray,然后使用标准比较器对返回的值进行排序。

答案 1 :(得分:1)

这是一种方式:

NSDictionary * dict1 = [[NSDictionary alloc]initWithObjectsAndKeys:[NSNumber numberWithInt:2], @"count", nil];
NSDictionary * dict2 = [[NSDictionary alloc]initWithObjectsAndKeys:[NSNumber numberWithInt:3], @"count", nil];

NSArray * arrayOfDictionaries = [[NSArray alloc]initWithObjects:dict1, dict2, nil];

NSArray * sortedArray = [arrayOfDictionaries sortedArrayUsingComparator:^NSComparisonResult(NSDictionary * obj1, NSDictionary * obj2) {

    // are points equal?
    if ([obj1[@"count"] intValue] != [obj2[@"count"] intValue]) {

        // points not equal, compare points
        if ([obj1[@"count"] intValue] > [obj2[@"count"] intValue])
            return (NSComparisonResult)NSOrderedAscending;
        else
            return (NSComparisonResult)NSOrderedDescending;
    }
    else {
        return (NSComparisonResult)NSOrderedSame;

    }
}];

让我知道它是怎么回事!

答案 2 :(得分:-1)

好的,只是添加其他人发布的内容(谢谢!)我也找到了我自己的解决方案,如下所示:

        NSArray *keysByFrequency = [object keysSortedByValueUsingComparator:^NSComparisonResult(NSDictionary* obj1, NSDictionary* obj2) {
            return [obj1[@"count"] compare:obj2[@"count"]];
        }];

        NSMutableArray *tags = [[NSMutableArray alloc] init];
        for (int i = keysByFrequency.count-1; i >= 0; i--) {
            [tags addObject:@{@"tag" : keysByFrequency[i], @"count" : object[keysByFrequency[i]][@"count"], @"type" : object[keysByFrequency[i]][@"type"]}];
        }