Подтвердить что ты не робот

Вычтите объекты в одном NSArray из другого массива

У меня есть два 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];

Я бы обычно проходил через тяжелую петлю, но я уверен, что есть более практичный путь. Что мне делать вместо этого?

4b9b3361

Ответ 1

Что-то вроде этого?

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

Ответ 2

Ответ Kirby в порядке, но: если вам не нужен порядок элементов в массивах, вместо этого вы должны использовать наборы. Если порядок важен, вы можете рассмотреть NSOrderedSet. Вы можете использовать методы -minusSet: или, для последних, -minusOrderedSet:.

Ответ 3

Как использовать предикаты?

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

Ответ 4

Учитывая два предположения: порядок неважен (или может быть восстановлен - например, если теперь массивы отсортированы) * и что ни один элемент не появляется более одного раза в любом массиве (хотя вы можете использовать подсчитанный набор для этого), набор может быть хорошим выбором.

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.

Ответ 5

Попробуйте следующее:

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