根据单独的数组排序字典数组?

时间:2014-03-21 04:28:54

标签: ios objective-c sorting nsdictionary keyvaluepair

我有点奇怪的问题。所以我有一系列词典说,

(
Dict 1:
"Name" = "B"
"Number" = "2"

Dict 2:
"Name" = "A"
"Number" = "1"

Dict 3:
"Name" = "D"
"Number" = "4"

Dict 4:
"Name" = "C"
"Number" = "3"

Dict 5
"Name" = "E"
"Number" = "5"
)

说我有一个阵列:

(
"1"
"4"
"2"
)

如何获得一个包含所有字典的数组,这些字典的“Number”键与该数组中的每个对象匹配,并根据第二个数组进行排序?

e.g。输出将是

(
Dict 1:
"Name" = "A"
"Number" = "1"

Dict 2:
"Name" = "D"
"Number" = "4"

Dict 3:
"Name" = "B"
"Number" = "2"
)

我想我可以使用sortedArrayUsingDescriptors,但我不确定如何指定多个描述符。描述符可以包含数组中的每个对象吗? 非常感谢任何帮助或指导。

4 个答案:

答案 0 :(得分:3)

这与排序无关 - 特别是因为并非所有数组中的字典都参与其中。你想要做的是解压缩数组中的每个字典。

如果你根本没有一系列字典,这会更简单。相反,你应该从一个大字典开始,其中键是数字,值是什么(也许是整个字典,也许只是名称)。现在,您只需将每个数字作为该字典中的键,并获取名称。

{ 1 => A, 2 => B, 3 => C ...}

现在只需抓住objectForKey:@1objectForKey:@4objectForKey:@2就可以了。

答案 1 :(得分:1)

for (NSNumber *aNumber in testArray) {
    for (NSDictionary *aDict in anArray) {
        if (aNumber.intValue == [(NSNumber *)[aDict valueForKey:@"Number"]intValue]) {
            [finalArray addObject:aDict];
        }
    }
}

答案 2 :(得分:0)

这是答案。在这里我使用了枚举器,这是更快的

NSArray * dicArray = @[@{@"Name": @"B",@"Number":@"2"},
                       @{@"Name": @"A",@"Number":@"1"},
                       @{@"Name": @"D",@"Number":@"4"},
                       @{@"Name": @"C",@"Number":@"3"},
                       @{@"Name": @"E",@"Number":@"5"}];
NSArray * indArray = @[@(1),@(4),@(2)];

NSMutableArray * resultArray = [NSMutableArray arrayWithCapacity:indArray.count];
[indArray enumerateObjectsUsingBlock:^(NSNumber* SearchValue, NSUInteger idx, BOOL *stop) {

    //search dicArray for object, which match your condition (i.e Number value == obj value)
    NSInteger index = [dicArray indexOfObjectPassingTest:^BOOL(NSDictionary* obj, NSUInteger idx, BOOL *stop) {
        return ([(NSString *)obj[@"Number"] integerValue] == SearchValue.integerValue)? YES : NO;
    }];

    resultArray[idx] = dicArray[index];
}];

NSLog(@"%@",resultArray);

答案 3 :(得分:0)

所以我明白了。 基本上我使用嵌套的for循环。

这是代码。可能需要很长时间,具体取决于每个对象的数量。对我来说,每个人大约有30个物体,所以花了大约50ms:

NSMutableArray *finalArray = [NSMutableArray array];
for (NSString *keyName in keyArray) {
    NSString *fname;
    for (NSDictionary *dict in dictArray) {
        fname = [dict objectForKey:@"theKey"];
        if ([fname isEqualToString:keyName])
            [finalArray addObject:dict];
    }
}