0

我正在尝试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 的实际值。

4

3 回答 3

5

您可以像这样使用 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有一篇关于's here的好文章。

于 2013-06-04T10:29:57.190 回答
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];
        }
    }
}
于 2013-06-04T09:14:38.093 回答
1

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

您可以通过以下方式获取值:

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]

作为比较器函数(来自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;
}
于 2013-06-04T09:13:47.017 回答