从另一个数组中减去一个NSArray中的对象

时间:2012-05-06 17:45:09

标签: objective-c cocoa cocoa-touch nsarray subtraction

我有两个NSArrays:

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

我通常会经历一些沉重的循环,但我确信有更实用的方法。我该怎么做呢?

5 个答案:

答案 0 :(得分:59)

这样的东西?

NSMutableArray *array = [NSMutableArray arrayWithArray:wants];
[array removeObjectsInArray:needs];

答案 1 :(得分:8)

Kirby的答案很好,但是:如果你不关心数组中元素的顺序,你应该使用集合。如果订单很重要,您可以考虑NSOrderedSet。您可以使用-minusSet:或后者-minusOrderedSet:方法。

答案 2 :(得分:8)

如何使用谓词?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", needs];
NSArray *wants_needs = [wants filteredArrayUsingPredicate:predicate];

答案 3 :(得分:2)

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

两组的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

答案 4 :(得分: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];
}