Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在公共键上连接两个对象数组_Objective C_Nsmutablearray_Nsdictionary - Fatal编程技术网

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] =&

我有两个NSMutable数组(每个数组至少有5000条记录),我希望将它们加入到单个数组/字典中。两个数组都有一个公共键=>值。我想要一个包含两个数组中的键/值的单个数组。我在PHP中看到了一些示例,(请参阅),但我正在寻找Objective C解决方案

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];
    }];