Finding Intersection of NSMutableArrays

前端 未结 5 1907
广开言路
广开言路 2020-11-28 09:30

I have three NSMutableArray containing names that are added to the lists according to different criterieas.

Here are my arrays pseudocode:

NSMutableA         


        
相关标签:
5条回答
  • 2020-11-28 10:25

    This is cleaner than the NSSet approach, and you won't lose the original ordering.

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@ AND self IN %@", array2, array3];
    NSArray *array4 = [array1 filteredArrayUsingPredicate:predicate];
    
    0 讨论(0)
  • 2020-11-28 10:27

    Use NSMutableSet:

    NSMutableSet *intersection = [NSMutableSet setWithArray:array1];
    [intersection intersectSet:[NSSet setWithArray:array2]];
    [intersection intersectSet:[NSSet setWithArray:array3]];
    
    NSArray *array4 = [intersection allObjects];
    

    The only issue with this is that you lose ordering of elements, but I think (in this case) that that's OK.


    As has been pointed out in the comments (thanks, Q80!), iOS 5 and OS X 10.7 added a new class called NSOrderedSet (with a Mutable subclass) that allows you to perform these same intersection operations while still maintaining order.

    0 讨论(0)
  • 2020-11-28 10:29

    Here is a working variant from links above

    NSPredicate *intersectPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@500, @400, @600]];
    NSArray *intersect = [@[@200, @300, @400] filteredArrayUsingPredicate:intersectPredicate];
    
    0 讨论(0)
  • 2020-11-28 10:32
    NSMutableArray *first = [[NSMutableArray alloc] initWithObjects:@"Jack", @"John", @"Daniel", @"Lisa",nil];
    
    NSMutableArray *seconds =[[NSMutableArray alloc] initWithObjects:@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica",nil];
    
    NSMutableArray *third = [ [ NSMutableArray alloc]init];
    
    
    for (id obj in first) {
    
        if ([seconds  containsObject:obj] ) {
    
    
            [third addObject:obj];
    
        }
    
    
    }
    
    
    NSLog(@"third is : %@ \n\n",third);
    

    OUTPUT:

    third is : (

    Jack,
    
    Lisa
    

    )

    0 讨论(0)
  • 2020-11-28 10:36

    Have a look at this post.

    In short: if you can use NSSet instead of NSArray, then it's trivial (NSMutableSet has intersectSet:).

    Otherwise, you can build an NSSet from your NSArray and go back to the above case.

    0 讨论(0)
提交回复
热议问题