32

我有两个 NSArray:

NSArray *wants = [NSArray arrayWithObjects:
                  @"apples", 
                  @"oranges", 
                  @"pineapple", 
                  @"mango", 
                  @"strawberries", 
                  nil];
NSArray *needs = [NSArray arrayWithObjects:
                  @"apples", 
                  @"pineapple", 
                  @"strawberries", 
                  nil];

我想要XOR他们。像wants - needs这样的东西,我剩下的就是

[NSArray arrayWithObjects:
@"oranges", 
@"mango", 
nil];

我通常会经历一些繁重的循环,但我相信有一种更实用的方法。我应该怎么做?

4

5 回答 5

62

像这样的东西?

NSMutableArray *array = [NSMutableArray arrayWithArray:wants];
[array removeObjectsInArray:needs];
于 2012-05-06T17:55:09.363 回答
9

使用谓词怎么样?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", needs];
NSArray *wants_needs = [wants filteredArrayUsingPredicate:predicate];
于 2015-05-18T19:28:52.923 回答
8

Kirby 的回答很好,但是:如果您不关心数组中元素的顺序,则应该使用集合。如果顺序很重要,您可以考虑NSOrderedSet. -minusSet:对于后者,您可以使用or-minusOrderedSet:方法。

于 2012-05-06T18:16:28.290 回答
2

给定两个假设:顺序不重要(或可以恢复 - 例如,如果数组现在已排序)* 并且没有项目在任一数组中出现多次(尽管您可以为此使用计数集),a set 可能是一个不错的选择。

两个集合的 XOR(严格来说,对称差)是并集减去交集:

NSMutableSet * unioned = [NSMutableSet setWithArray:wants];
[unioned unionSet:[NSSet setWithArray:needs]];
NSMutableSet * intersection = [NSMutableSet setWithArray:needs];
[intersection intersectSet:[NSSet setWithArray:wants]];

[unioned minusSet:intersection];

*如果顺序很重要,您可以使用NSOrderedSet.

于 2012-05-06T18:16:53.063 回答
0

尝试这个:

NSArray *NSArray_XOR(NSArray *arr1, NSArray *arr2)
{
    NSMutableArray *results = [NSMutableArray array];

    for (int i = 0; i < arr1.count; i++) {
        id obj = [arr1 objectAtIndex:i];

        if (![arr2 containsObject:obj])
            [results addObject:obj];
    }

    for (int i = 0; i < arr2.count; i++) {
        id obj = [arr2 objectAtIndex:i];

        if (![arr1 containsObject:obj])
            [results addObject:obj];
    }

    // make a unmutable copy of the array.
    return [NSArray arrayWithArray:results];
}
于 2012-05-06T18:16:44.703 回答