2009-09-25 5 views
27

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

ответ

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

Использование NSMutableSet:

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

[setOne minusSet: setTwo]; 

NSArray *arrayOneResult = [setOne allObjects]; 

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

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

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

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

+0

Если порядок элементов в массиве имеет важное значение, то я думаю, можно было бы использовать другое решение с NSArray, правильно? –

+0

Хороший ответ, но, как вы сказали, я использую только небольшие наборы данных, поэтому я собираюсь использовать другое решение. Спасибо, в любом случае! – Joshua

+0

Yup-- для небольших наборов данных ответ «newacct» - это путь. – bbum

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) 
Смежные вопросы