0

一段时间以来,我一直在尝试从逻辑上思考这个问题,通常我可以通过写出来或在做其他与编程无关的事情时思考它来解决它。但是我尝试的一切都不起作用。所以基本上我有 2 NSArrays,它们都是从 2 个不同的 plist 中填充的。每个数组都填充了所有字典:所有字典都具有相同的键,并且都具有相同的结构,但有些可能具有与键相关联的信息,而有些则没有。我基本上需要检查每个项目array1,看看它是否存在array2,如果它不存在,array2然后将它添加到array1(或者array3看看你如何在迭代数组时不能改变它)。我需要它来查看它是否通过特定键“ name_key”存在。

所以...简而言之,我的最终结果需要是一个NSArray包含两个数组中的所有对象,而没有具有重复名称的对象(来自字典name_key)。

下面是我的实际代码不起作用。

在下面的代码中:originalWhiskiesListArray= array1 newWhiskiesListArray= array2 combinedWhiskiesListArray= array3(因为您不能在迭代数组时对其进行变异。

BOOL whiskyExists = YES;
    for (NSDictionary *newWhisky in newWhiskiesListArray) {

        for (NSDictionary *originalWhisky in originalWhiskiesListArray) {
            NSString * newWhiskyNameString = [[newWhisky objectForKey:NAME_KEY] lowercaseString];
            NSString * origWhiskyNameString = [[originalWhisky objectForKey:NAME_KEY] lowercaseString];

           //Compare lowercase strings and if they don't match then add them to the original plist array.
            if ([newWhiskyNameString isEqualToString:origWhiskyNameString]) {
                whiskyExists = YES;
                break;
            } else {
                whiskyExists = NO;
                break;
                //NSLog(@"Whisky names do not match. New Whisky: %@ Old Whisky: %@",[newWhisky objectForKey:NAME_KEY],[originalWhisky objectForKey:NAME_KEY]);
                //doesn't match so add it
                                }
        }
        if (whiskyExists == NO) {
            [combinedWhiskiesListArray addObject:newWhisky];
            NSLog(@"newWhisky added");
            whiskyExists = YES;
        }

    }
4

2 回答 2

0

如果我对您的理解正确,您可以将每个字典中的所有值添加到 NSMutableSet 中,如果它已经存在于集合中,则不会添加项目。然后,您可以使用 NSSet 方法 allObjects 将集合转换回数组。

于 2013-01-14T04:57:09.367 回答
0

威士忌名称字符串中的任何一个都可以为零吗?如果是这样,那么这会破坏 isEqualToString 比较,因为您始终可以发送返回 NO 的消息 nil。

我也相信休息是错误的。您只需要在遇到匹配时退出内部循环。如果不是,您必须继续前进,直到内循环结束。

于 2013-01-14T06:33:12.020 回答