Сравнение двух массивов

У меня есть два NSArrays, что я хочу сделать, это сравнить два массива, которые содержат строки, найти сходства и создать первый массив снова, но они не имеют сходства.

Просто для примера что-то вроде.

Два массива:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil];
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil];

Результат:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil];

NSArray *arrayOneCopy = [NSArray arrayWithObjects:@"TD1", @"TD3", nil];
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil];

Ответ 1

NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne];
[arrayOneCopy removeObjectsInArray:arrayTwo];

Ответ 2

Используйте NSMutableSet:

NSMutableSet *setOne = [NSMutableSet setWithArray: arrayOne];
NSMutableSet *setTwo = [NSMutableSet setWithArray: arrayTwo];

[setOne minusSet: setTwo];

NSArray *arrayOneResult = [setOne allObjects];

(строго говоря, setTwo не может быть изменчивым, также может быть NSSet (который работает лучше))

Или используйте NSArray, как ответил другой человек. Это тоже работает.

Какой из них работает, полностью зависит от вашего размера набора данных. Для небольших наборов данных решение массива отлично работает. Для более крупных наборов NSSet будет намного более эффективным в том, что тесты на членство являются хэш-проверкой, а не линейным поиском.

Измерьте и используйте тот, который лучше всего работает.

Ответ 3

- (NSInteger)countOfDifferentObjects:(NSArray *)anotherArray {

    NSSet * s = [NSSet setWithArray:self];
    NSMutableSet * s1 = [NSMutableSet setWithSet:s];
    NSSet * s2 = [NSSet setWithArray:anotherArray];

    [s1 unionSet:s2];
    [s1 minusSet:s];
    return [s1 count];
}

Это возвращает количество разных объектов между двумя массивами (сравнение с isEqual)

array1 = @"A", @"B", @"C"
array2 = @"B", @"D", @"Z"
returns 2 (D and Z are different)