我有两个键值对数组。这两个数组都包含不同的键值对。我想在第一个数组中找到基于特定键不属于第二个数组的元素。
示例:
第一个数组 - [{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"];
}
}
答案 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;
}
)}