Ответ 1
NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne];
[arrayOneCopy removeObjectsInArray:arrayTwo];
У меня есть два 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];
NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne];
[arrayOneCopy removeObjectsInArray:arrayTwo];
Используйте NSMutableSet:
NSMutableSet *setOne = [NSMutableSet setWithArray: arrayOne];
NSMutableSet *setTwo = [NSMutableSet setWithArray: arrayTwo];
[setOne minusSet: setTwo];
NSArray *arrayOneResult = [setOne allObjects];
(строго говоря, setTwo
не может быть изменчивым, также может быть NSSet
(который работает лучше))
Или используйте NSArray, как ответил другой человек. Это тоже работает.
Какой из них работает, полностью зависит от вашего размера набора данных. Для небольших наборов данных решение массива отлично работает. Для более крупных наборов NSSet будет намного более эффективным в том, что тесты на членство являются хэш-проверкой, а не линейным поиском.
Измерьте и используйте тот, который лучше всего работает.
- (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)