Fastest way to check if an array contains the same objects of another array

后端 未结 10 1838
夕颜
夕颜 2020-12-29 04:36

The goal is to compare two arrays as and check if they contain the same objects (as fast as possible - there are lots of objects in the arrays). The arrays cannot be checked

相关标签:
10条回答
  • 2020-12-29 05:05

    If you want to check whether both arrays contain the same duplicates, just use NSCountedSet. It's like an NSSet, but each object in the set also has a count telling you how often it has been added. So

    BOOL same = (array1.count == array2.count);
    if (same && array.count > 0)
    {
        NSCountedSet* set1 = [[NSCountedSet alloc] initWithArray:array1];
        NSCountedSet* set2 = [[NSCountedSet alloc] initWithArray:array2];
        same = ([set1 isEqual: set2]);
    }
    

    No matter how you do it, this will be time consuming, so you might consider if there are special cases that can be handled quicker. Are these arrays usually the same, or almost the same, or is it true 99% of the time that they are different and that 99% of the time a random element of array1 is not in array2? Are the arrays often sorted? In that case, you could check whether there are identical objects in identical positions, and then consider only those objects that are not the same. If one array contains objects a, b, c, d, e and the other contains a, b, x, d, y, then you only need to compare the array [c, e] vs. [x, y].

    0 讨论(0)
  • 2020-12-29 05:07

    How about converting both arrays to sets and comparing them.

    NSSet *set1 = [NSSet setWithArray:arr1];
    NSSet *set2 = [NSSet setWithArray:arr2];
    

    Compare the two using

    if([set1 isEqualToSet:set2]) {
    
    }
    
    0 讨论(0)
  • 2020-12-29 05:07
    [docTypes containsObject:@"Object"];
    

    It will works for your req. As early as fast it will return boolean value for it.

    0 讨论(0)
  • 2020-12-29 05:07
    NSArray *filtered = [someArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"someParamter == %@", paramValue]]];
    if (filtered.count) {
    
    }
    

    the main plus is you can use it for any kind of objects: custom, system, NSDictionary. for example I need to know is my UINavigationController's stack contains MySearchResultsVC and MyTopMenuItemsVC or not:

        NSArray *filtered = [self.navigationController.viewControllers filteredArrayUsingPredicate:
                                         [NSPredicate predicateWithFormat:@"class IN %@",
                                          [NSArray arrayWithObjects:
                                           [MySearchResultsVC class],
                                           [MyTopMenuItemsVC class],
                                           nil]]];
    if (filtered) {
    /* ok, now we can handle it! */
    }
    
    0 讨论(0)
  • 2020-12-29 05:08

    i guess this will do:

    [array1 isEqualToArray:array2];
    

    returns bool;

    0 讨论(0)
  • 2020-12-29 05:15

    Use containsObject: method instead of iterating the whole array.

    NSArray *array;
    array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",                                       @"Luciano", @"Silvia", nil];
    if ([array containsObject: @"Nicola"]) // YES
      {
        // Do something
      }
    

    like this

    + (BOOL)arraysContainSameObjects:(NSArray *)array1 andOtherArray:(NSArray *)array2 {
        // quit if array count is different
        if ([array1 count] != [array2 count]) return NO;
    
        BOOL bothArraysContainTheSameObjects = YES;
    
        for (id objectInArray1 in array1) {
    
            if (![array2 containsObject:objectInArray1])
            {
                bothArraysContainTheSameObjects = NO;
                break;
            }
    
        }
    
        return bothArraysContainTheSameObjects;
    }
    
    0 讨论(0)
提交回复
热议问题