Objective c 在公共键上连接两个对象数组
我有两个NSMutable数组(每个数组至少有5000条记录),我希望将它们加入到单个数组/字典中。两个数组都有一个公共键=>值。我想要一个包含两个数组中的键/值的单个数组。我在PHP中看到了一些示例,(请参阅),但我正在寻找Objective C解决方案Objective c 在公共键上连接两个对象数组,objective-c,nsmutablearray,nsdictionary,Objective C,Nsmutablearray,Nsdictionary,我有两个NSMutable数组(每个数组至少有5000条记录),我希望将它们加入到单个数组/字典中。两个数组都有一个公共键=>值。我想要一个包含两个数组中的键/值的单个数组。我在PHP中看到了一些示例,(请参阅),但我正在寻找Objective C解决方案 NSMutableArray #1: { [0] => NSObject { [itemID] => 221 [Name] => "Adam" } [1] =&
NSMutableArray #1:
{
[0] => NSObject
{
[itemID] => 221
[Name] => "Adam"
}
[1] => NSObject
{
[itemID] => 7
[Name] => "Jacob"
}
}
NSMutableArray #2:
{
[0] => NSObject
{
[itemID] => 221
[location] => floor 1
[room] => 56
}
[1] => NSObject
{
[itemID] => 7
[location] => floor 2
[room] => 12
}
}
我要找的是:
NSMutableArray
{
[0] => NSObject
{
[itemID] => 221
[Name] => "Adam"
[location] => floor 1
[room] => 56
}
[1] => NSObject
{
[itemID] => 7
[Name] => "Jacob"
[location] => floor 2
[room] => 12
}
}
谢谢你的建议:)这不是最有效的方法,但应该可以
NSMutableArray* result = [[NSMutableArray alloc] init];
for (NSDictionary* dict1 in array1) {
for (NSDictionary* dict2 in array2) {
if ([[dict1 objectForKey:@"itemID"] isEqual:
[dict2 objectForKey:@"itemID"]]) {
NSMutableDictionary* dict = [dict1 mutableCopy];
[dict addEntriesFromDictionary:dict2];
[result addObject: dict];
break;
}
}
}
更新
以下是一些提高效率的方法
(1) 在比较阵列之前对其进行排序:
- (NSArray*)sortArray:(NSArray*)array {
NSArray* sortDescriptors =
@[[[NSSortDescriptor alloc] initWithKey:@"itemID"
ascending:YES]];
NSArray* result = [array sortedArrayUsingDescriptors:sortDescriptors];
return result;
}
(2) 反向迭代你的字典。然后,只要获得匹配项,就删除内部数组的结尾(这是合理的,因为数组已排序,从数组结尾删除对象应该比从开头删除更有效)
(3) 使用基于块的快速枚举:
[sortedArray1 enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:
^(NSDictionary* dict1, NSUInteger idx, BOOL *stop) {
[sortedArray2 enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:
^(NSDictionary* dict2, NSUInteger jdx, BOOL *stop) {
if ([[dict1 objectForKey:@"itemID"] isEqual:
[dict2 objectForKey:@"itemID"]]) {
NSMutableDictionary* dict = [dict1 mutableCopy];
[dict addEntriesFromDictionary:dict2];
[result addObject: dict];
NSRange range= NSMakeRange(jdx, sortedArray2.count-1-jdx);
[sortedArray2 removeObjectsInRange:range];
*stop = YES;
}
}];
}];
(2)和(3)之间的计算差异可能可以忽略不计,但(3)的优点是在每次迭代时传入索引和对象,而在(2)中,您需要使用indexOfObject
获得索引
如果确定每个数组都有相同的比较键值集,则可以省去NSRange
,并将内部数组简化为:
[sortedArray2 removeLastObject];
最后
如您的问题所示,如果您事先知道数据已排序,并且各个数组对象之间存在一对一的对应关系,则可以简化:
[arrayA enumerateObjectsUsingBlock:
^(NSDictionary* dict, NSUInteger idx, BOOL *stop) {
NSMutableDictionary* mutableDict = [dict mutableCopy];
[mutableDict addEntriesFromDictionary:arrayB[idx]];
[result addObject:mutableDict];
}];
非常感谢您提供了非常翔实和循序渐进的答案!很抱歉,尝试使用最后一个选项时出现错误“expression expected”。错误在第[arrayA EnumerateObjectsSusingBlock:{语法中有错误吗?@user2716667-是的,有两个错误…第1行有一个无关的
{
和一个缺少的]
第4行。现已修复。您是正确的,两个数组的项目数完全相同……因此,如果您能够正确排序,并且您确定arrayA[i]将与arrayB[i]合并,最后一段代码应该足够了。@user2716667-我只是对“finally..”代码的第4行做了一点小小的改进…您可以用数组文字语法arrayB[idx]
替换旧式的[arrayB objectAtIndex:idx]
[arrayA enumerateObjectsUsingBlock:
^(NSDictionary* dict, NSUInteger idx, BOOL *stop) {
NSMutableDictionary* mutableDict = [dict mutableCopy];
[mutableDict addEntriesFromDictionary:arrayB[idx]];
[result addObject:mutableDict];
}];