2013-03-31 3 views
5

В классе NSArray существует метод isEqualToArray:, который сравнивает два массива и указывает, совпадают они или нет.Сравнение двух массивов, игнорирующих порядок

У меня есть два массива, которые имеют элементы в другом порядке. Например:

NSMutableArray* arr1 = [@[@"one", @"two", @"three"] mutableCopy]; 
NSMutableArray* arr2 = [@[@"three", @"one", @"two"] mutableCopy]; 

BOOL same = [arr1 isEqualToArray:arr2]; 
NSLog(@"%d", same); 

В приведенном выше примере, хотя arr1 и arr2 есть же элементы, isEqualToArray: возвращается NO. Как я могу сравнить два массива, как указано выше, без повторения каждого элемента в цикле for/while?

+0

Умный ответ MartinR на этот: http://stackoverflow.com/questions/15709494/compare-two-arrays-with-the-same-value-but-with-a-different-order – Monolo

ответ

7

Используйте NSSet, а затем сравните.

NSSet *set1=[NSSet setWithArray:arr1]; 
NSSet *set2=[NSSet setWithArray:arr2]; 

BOOL same=[set1 isEqualToSet:set2]; 

EDIT:

Если у вас есть дубликаты в arr1 и arr2, а затем использовать:

NSCountedSet *set1=[NSCountedSet setWithArray:arr1]; 
NSCountedSet *set2=[NSCountedSet setWithArray:arr2]; 

BOOL same=[set1 isEqualToSet:set2]; 
+3

Обратите внимание, что это работает только в том случае, если не гарантируется отсутствие дубликатов в любом массиве. «NSCountedSet» должен заботиться о вещах, если могут быть повторяющиеся значения. – rmaddy

+0

С помощью вашего метода не будут равны массивы (один, два, один, три) и (три, два, один)? Поскольку каждый элемент множества отличается. – Levi

+0

@ Levi Правильно. Вот почему вместо «NSSet» следует использовать «NSCountedSet». – rmaddy

3

Я предлагаю вам разобраться как массивы, и сравнить полученные результаты с помощью метода вы пытались ,

+1

Это будет работать, только если все элементы сопоставимы, например. fail, если массив содержит как строки, так и числа, или произвольные объекты, которые не имеют метода сравнения. –

+0

@MartinR можно, но я не видел никого, кто хотел бы сравнить 2 массива с несколькими типами данных. Как бы вы сравнили их в этом случае? – Levi

+1

Все объекты реализуют 'hash' и' isEqual' (и это то, что '[NSSet setWithArray: ...]' или лучше '[NSCountedSet setWithArray: ...]' использует), поэтому этот метод работает с произвольными объектами. –

Смежные вопросы