按升序排序NSDictionary

时间:2013-06-04 09:09:34

标签: iphone ios objective-c json sorting

我正在尝试按升序排序NSDictionary。我正在使用此代码:

NSDictionary *valDict = self.mGetDataDict[key][rowKey];

for (NSString *valueKey in
     [[valDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
{                
    if ([valueKey isEqualToString:@"attr"])
    {
        dictRow = self.mGetDataDict[key][rowKey][valueKey];
    }
    else {
        NSString *valKey = self.mGetDataDict[key][rowKey][valueKey];
        [arrSeatsStatus addObject:valKey];
    }
}

这是我得到的输出:

1 = off;
10 = off;
2 = on;
3 = on;
4 = on;
5 = on;
6 = on;
7 = on;
8 = on;
9 = on;

这是必需的输出:

1: "off",
2: "on",
3: "on",
4: "on",
5: "on",
6: "on",
7: "on",
8: "on",
9: "on",
10: "off"

所需输出是来自JSON的实际值。

3 个答案:

答案 0 :(得分:6)

您可以像这样使用NSSortDescriptor:

NSArray* array1 = @[@"1 = off", @"10 = off", @"2 = on", @"3 = on"];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES selector:@selector(localizedStandardCompare:)];

NSLog(@"Ordered array: %@", [array1 sortedArrayUsingDescriptors:@[ descriptor ]]);

产生这个输出:

2013-06-04 12:26:22.039 EcoverdFira[3693:c07] Ordered array: (
  "1 = off",
  "2 = on",
  "3 = on",
  "10 = off"
)

NSSortedDescriptor here上有一篇好文章。

答案 1 :(得分:2)

尝试使用这个....

//改变.......

NSArray *valDict = [[self.mGetDataDict allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSMutableDictionary *orderedDictionary=[[NSMutableDictionary alloc] init];

for (NSString *valor in valDict)
{
    for (NSString *clave in [yourDictionary allKeys])
    {
        if ([valor isEqualToString:[valDict valueForKey:clave]]) 
        {
            [orderedDictionary setValue:valor forKey:clave];
        }
    }
}

答案 2 :(得分:0)

获取值数组,对该数组进行排序,然后获取与该值对应的键。

您可以使用以下内容获取值:

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

但是,如果集合与您在示例中显示的一样,(我的意思是,您可以从键中推断出值),您可以随时对键进行排序,而不是弄乱值。

使用:

NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)];

比较器是一个消息选择器,它被发送到您想要订购的对象。

如果要订购字符串,则应使用NSString比较器。 NSString比较器是:caseInsensitiveCompare或localizedCaseInsensitiveCompare:。

如果这些都不适合您,您可以调用自己的比较器功能

[values sortedArrayUsingFunction:comparatorFunction context:nil]

作为comparatorFunction(来自AppleDocumentation

NSInteger intSort(id num1, id num2, void *context)
{
    int v1 = [num1 intValue];
    int v2 = [num2 intValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}