检查一个数组是否包含目标C中另一个数组的对象

时间:2015-06-15 12:07:11

标签: ios objective-c arrays

我正在使用下面的函数来检查数组中的对象是否存在于另一个数组中。如果对象不存在,那么我将该对象添加到新数组,否则该对象将不会包含在我实例化的新数组中。

+ (NSMutableArray *)loadUngroupedSpeakerList
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSMutableArray *speakerList = [[NSMutableArray alloc] init];
    NSArray *speakerIDList = [userDefaults objectForKey:DATA_SPEAKER_IDLIST];
    NSArray *speakerIDListGrouped = [userDefaults objectForKey:DATA_SPEAKER_IDLIST_GROUPED];

    //**** this is for checking the contents of speakerIDListGrouped ****//
    for(NSString *speakerID in speakerIDListGrouped)
    {
        NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList check content:%@", speakerID);
    }

    for(NSString *speakerID in speakerIDList)
    {
        if(![speakerIDListGrouped containsObject:speakerID])
        {
            NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList: speakerID: %@", speakerID);

            NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];

            [speakerList addObject:speakerDict];
        }
    }

    return speakerList;
}

在上面的代码中, speakerList 包含所有speakerID。虽然 speakerIDListGrouped 仅包含组中使用的speakerID。我的函数需要消除组中使用的所有speakerID,所以我的方式就像上面的代码一样。

我的问题: 当我运行代码时,我注意到即使 speakerIDListGrouped 包含 speakerIDList 中的对象,这两行仍然会被执行

NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];

[speakerList addObject:speakerDict];

虽然我明白,但不应该发生。因为我只允许在 speakerIDList 不包含该对象时执行它们。

这是我执行代码时的日志:

2015-06-15 19:31:24.849 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:72243140485836704
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:7782687177520836128
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 72243140485836704
2015-06-15 19:31:24.851 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 7782687177520836128

可以看出,speakerIDListGrouped DOES 包含两个对象。但是,当我尝试将下面的for循环中的字符串硬编码到我在Log上打印的对象之一时,这是72243140485836704。该函数现在正常工作,我的意思是它没有执行我显示的两行之前。

我现在很困惑。我硬编码的字符串和从数组中获取的字符串有什么区别?内容是一样的。

非常感谢!

2 个答案:

答案 0 :(得分:1)

我做了同样的事情,它工作得很好......

NSMutableArray *speakerList = [[NSMutableArray alloc] init];
NSArray *speakerIDList = @[@"a",@"b",@"c",@"d",@"e"];
NSArray *speakerIDListGrouped =@[@"a",@"b",@"f",@"g",@"h"];
for(NSString *speakerID in speakerIDListGrouped)
{
    NSLog(@"%@", speakerID);
}

for(NSString *speakerID in speakerIDList)
{
    if(![speakerIDListGrouped containsObject:speakerID])
    {
        NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList: speakerID: %@", speakerID);



        [speakerList addObject:speakerID];
    }
}

数组中的对象可能存在一些问题....

答案 1 :(得分:0)

此答案将帮助其他人。非常简单,请使用以下NSArray方法

id commonObject = [array1 firstObjectCommonWithArray:array2];

参考:https://developer.apple.com/documentation/foundation/nsarray/1408825-firstobjectcommonwitharray?language=objc