简体   繁体   中英

Checking If One Array Contains An Object of Another Array In Objective C

I am using below function to check whether if an object in an array is present in another array. If the object not present, then I will ADD that object to the new array, or else that object will NOT be included in the new array that I instantiated.

+ (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;
}

In the above code, speakerList contains all the speakerIDs. While speakerIDListGrouped only contains the speakerIDs that are used in a group. My function needs to eliminate all the speakerIDs used in a group so I did it in a way just like the above code.

My Problem: When I run the code, I notice that even if speakerIDListGrouped contains the object in speakerIDList , these two lines would still be executed

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

[speakerList addObject:speakerDict];

Whereas to I understand, It should not happen. Because I only allowed them to be executed only if speakerIDList does not contain that object.

This is the log when I execute the code:

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

As can be seen, speakerIDListGrouped DOES contain the two objects. However, when I tried replacing the string inside the lower for loop by hardcoding it to one of the objects I printed on Log, which was 72243140485836704. The function now works properly, I mean it didn't execute the two lines I showed before.

I am now confused. What is the difference between the string I hardcoded and the one that was obtained from the array? The contents are the same.

Many Thanks!

I did the same thing it is working fine...

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

There might be some issue with the objects inside the array....

This answer will help other's. It's very simple, use following method of NSArray

id commonObject = [array1 firstObjectCommonWithArray:array2];

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM