我有两个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];
我通常会经历一些沉重的循环,但我确信有更实用的方法。我该怎么做呢?
答案 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];
}