根据字典键查找不同的数组元素

时间:2015-02-03 13:20:37

标签: ios objective-c iphone

我有两个键值对数组。这两个数组都包含不同的键值对。我想在第一个数组中找到基于特定键不属于第二个数组的元素。

示例:

第一个数组 - [{id = 1,name =“foo”},              {id = 2,name =“bar”}]

第二阵列 - [{id = 2,name =“abc”},              {id = 1,name =“xyz”}]

我有没有办法实现同样的目标? 现在我通过这两个数组枚举如下:

for (NSDictionary *eachPlayer in 1stArray) {
        for (NSDictionary *eachPrediction in 2ndArray) {
            if (eachPrediction[kId] != eachPlayer[kId]) {
                [self.predictPlayerArray addObject:eachPlayer];
            }
        }
    }

但是在上述情况下失败并将值加到predictionPlayerArray - 在第一次迭代中它加1并且在第四次迭代中它增加2.如何防止这种情况发生? 感谢。

修改

我似乎已经用这种方式解决了这个问题。不是最好的解决方案,但似乎有效:

for (NSDictionary *eachPlayer in arrayOne) {
        for (NSDictionary *eachPrediction in arrayTwo) {
            if (eachPrediction[kId] == eachPlayer[kId]) {
                if ([self.predictPlayerArray containsObject:eachPlayer]) {
                    [self.predictPlayerArray removeObject:eachPlayer];
                }
                break;
            }
            else {
                [self.predictPlayerArray addObject:eachPlayer];
            }
            self.predictPlayerArray = [self.predictPlayerArray valueForKeyPath:@"@distinctUnionOfObjects.self"];
        }
    }

1 个答案:

答案 0 :(得分:0)

这样的事情应该做:

NSArray *array1 = @[@{@"1":@"foo"},@{@"2":@"bar"},@{@"3":@"abc"}];
NSArray *array2 = @[@{@"2":@"abc"},@{@"1":@"abc"},@{@"4":@"foo"}];
NSMutableSet *result = [NSMutableSet new];
for (NSDictionary *dict1 in array1){
    [dict1 enumerateKeysAndObjectsUsingBlock:^(id key1, id obj1, BOOL *stop1) {
        for (NSDictionary *dict2 in array2) {
            [dict2 enumerateKeysAndObjectsUsingBlock:^(id key2, id obj2, BOOL *stop2) {
                if ([obj2 isEqual:obj1]){
                    [result addObject:@{key1:obj1}];
                    *stop2 = YES;
                }
            }];
        }
    }];
}
NSLog(@"result %@", result);

由于你有嵌套字典,你应该在它们中迭代,最后将结果存储在一个阻止重复条目的集合中(如果使用NSMutableArray,你将有两次{3:abc})

日志输出为:

2015-02-03 13:53:07.897 test[19425:407184] result {(
    {
    1 = foo;
},
    {
    3 = abc;
}
)}