Objective c 添加1个数组中的项目2另一个按字典键筛选的项目

Objective c 添加1个数组中的项目2另一个按字典键筛选的项目,objective-c,nsarray,nsdictionary,Objective C,Nsarray,Nsdictionary,我已经试着从逻辑上思考了一段时间,通常我可以通过写出来或者在做其他与编程无关的事情时思考来解决它。然而,我尝试的一切都不起作用。因此,基本上我有两个nsarray,它们都是由两个不同的plist填充的。每个数组都充满了所有的字典:所有的字典都有相同的键,所有的字典都有相同的结构,但有些可能有与键相关的信息,而有些则没有。我基本上需要检查array1中的每个项目,看看它是否存在于array2中,如果它不存在于array2中,那么将它添加到array1(或者array3中,看看在迭代过程中如何不能对

我已经试着从逻辑上思考了一段时间,通常我可以通过写出来或者在做其他与编程无关的事情时思考来解决它。然而,我尝试的一切都不起作用。因此,基本上我有两个
nsarray
,它们都是由两个不同的plist填充的。每个数组都充满了所有的字典:所有的字典都有相同的键,所有的字典都有相同的结构,但有些可能有与键相关的信息,而有些则没有。我基本上需要检查
array1
中的每个项目,看看它是否存在于
array2
中,如果它不存在于
array2
中,那么将它添加到
array1
(或者
array3
中,看看在迭代过程中如何不能对数组进行变异)。我需要它来查看它是否通过特定的键“
name\u key
”存在

所以。。。简言之,我的最终结果需要是一个
NSArray
,其中包含两个数组中的所有对象,而不包含名称重复的对象(来自字典
name\u key

下面是我的实际代码,它不工作

在下面的代码中:originalwhiskieslistaray=array1
newwhiskieslistaray
=
array2
CombinedWhiskiesStarray
=
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;
        }

    }

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

威士忌名称字符串中是否有一个为零?如果是,则会中断isEqualToString comparison,因为您总是可以发送消息nil,返回NO


此外,我认为中断是错误的。你只需要在遇到匹配的情况下退出内环。否则,你必须继续进行,直到内环结束。

不,没有一个是零。但如果这很重要,它们确实有一些数字。例如“麦卡伦12年”可能是威士忌的名字之一。是的,但第二个中断是错误的,因为它会取消第一个元素的内部循环,即使它不匹配。好的,我明白你的意思。这是一种好方法吗?循环数组并比较我的意思。好的,循环是一种很好的方法,就像现在一样。按键将对象排序到字典或使用集合需要更多的代码行。因此,我认为如果项目列表相对较小,则无法获得任何东西。如果项目列表较大,则我将使用CoreData。内部循环中的第二个中断就是问题所在。非常感谢。我不确定这是否可行,因为在
OriginalWhiskiesSlistaray
用户将信息保存在一些键中,例如,他们可以保存一个介于1-5之间的评级,如果数组中的某个项在
name\u键下具有相同的名称,但在
rating\u键下具有不同的评级,则会将其视为不同的对象并将其添加。我认为,至少它与
containsObject:
方法。我试图在数组中使用
containsObject:
方法。