【问题标题】:Finding distinct array elements based on dictionary key根据字典键查找不同的数组元素
【发布时间】:2015-04-02 17:03:44
【问题描述】:

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

例子:

第一个数组 - [{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"];
        }
    }

【问题讨论】:

  • 你能告诉我们你想在结果数组中完成什么吗?每个数组的值都不同。如果您想检查是否存在密钥,则方法略有不同
  • 在这种情况下,结果数组应该为零。现在如果第一个数组还有一个条目,比如 [3 :"abc"],结果将是 [3 :"abc"]
  • A NSPredicate 并且可能正在寻找 @unionOfArarys 或者可能不在 (stackoverflow.com/questions/8580715/…),因为不清楚您真正想要什么。
  • @Anil 你说“我想根据特定键在第一个数组中查找不属于第二个数组的元素”,但希望结果数组为零,即使没有第一个数组中的元素是第二个数组的一部分......我同意目前还不清楚你想要什么......
  • @LyndseyScott 我已经对示例进行了编辑。

标签: ios objective-c iphone


【解决方案1】:

应该这样做:

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

【讨论】:

  • 这似乎不能解决问题。字典中也有嵌套字典。
  • 这就是您在示例中拥有的带有嵌套字典的数组。任何地方的字典里都没有字典
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多