3

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

(
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"
)

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

例如输出将是

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

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

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

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

4

4 回答 4

3

这与排序无关 - 特别是因为并非数组中的每个字典都参与其中。您要做的是从数组中提取每个字典。

如果您根本没有字典数组,这会简单得多。相反,您应该从一个大字典开始,其中键是数字,值是任何内容(可能是整个字典,也可能是名称本身)。现在您可以将每个数字作为该字典的键查找并获取名称。

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

现在只需抓住objectForKey:@1, objectForKey:@4objectForKey:@2就完成了。

于 2014-03-21T04:42:13.503 回答
1
for (NSNumber *aNumber in testArray) {
    for (NSDictionary *aDict in anArray) {
        if (aNumber.intValue == [(NSNumber *)[aDict valueForKey:@"Number"]intValue]) {
            [finalArray addObject:aDict];
        }
    }
}
于 2014-03-21T05:41:18.997 回答
0

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

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

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];
    }
}
于 2014-03-21T05:35:22.337 回答
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);
于 2014-03-21T05:16:29.473 回答