32

I have two NSArrays:

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

And I want to XOR them. Something like wants - needs so that what I have left is

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

I would normally go through some heavy looping, but I am sure there is a more practical way. What should I do instead?

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

カービィの答えは問題ありませんが、配列内の要素の順序を気にしない場合は、代わりにセットを使用する必要があります。順序が重要な場合は、を検討してNSOrderedSetください。-minusSet:または、後者の場合はメソッドを使用できます-minusOrderedSet:

于 2012-05-06T18:16:28.290 に答える
2

2つの仮定が与えられます:順序は重要ではありません(または復元できます-たとえば、配列が今ソートされている場合)*、そしてどちらの配列にもアイテムが複数回表示されない(ただし、これにはカウントされたセットを使用できます)、セットは良い選択かもしれません。

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

于 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 に答える