我有点奇怪的问题。所以我有一系列词典说,
(
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
,但我不确定如何指定多个描述符。描述符可以包含数组中的每个对象吗?
非常感谢任何帮助或指导。
答案 0 :(得分:3)
这与排序无关 - 特别是因为并非所有数组中的字典都参与其中。你想要做的是解压缩数组中的每个字典。
如果你根本没有一系列字典,这会更简单。相反,你应该从一个大字典开始,其中键是数字,值是什么(也许是整个字典,也许只是名称)。现在,您只需将每个数字作为该字典中的键,并获取名称。
{ 1 => A, 2 => B, 3 => C ...}
现在只需抓住objectForKey:@1
,objectForKey:@4
,objectForKey:@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];
}
}