2013-03-31 14 views
5

W klasie NSArray istnieje metoda isEqualToArray:, która porównuje dwie tablice i wskazuje, czy pasują, czy nie.Porównanie dwóch tablic ignorujących porządek

Mam dwie tablice, które mają elementy w różnych porządkach. Na przykład:

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

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

W powyższym przykładzie, chociaż arr1 i arr2 mają takie same elementy, isEqualToArray: wraca NO. Jak mogę porównać dwie tablice, jak wspomniano powyżej, bez konieczności powtarzania każdego elementu w pętli for/while?

+0

Zobacz mądrą odpowiedź Martina na to: http://stackoverflow.com/questions/15709494/compare-two-arrays-with-same-value-but-with-a-different-order – Monolo

Odpowiedz

7

Użyj NSSet, a następnie porównaj.

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

BOOL same=[set1 isEqualToSet:set2]; 

EDIT:

Jeśli masz duplikaty w arr1 i ARR2, a następnie użyć:

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

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

Pamiętaj, że to działa tylko wtedy, gdy jest zagwarantowane, że nie ma duplikatów w żadnej z tablic. 'NSCountedSet' powinien zająć się rzeczami, jeśli mogą występować zduplikowane wartości. – rmaddy

+0

Przy użyciu tej metody tablice (jedna, dwie, jedna, trzy) i (trzy, dwa, jedno) nie będą równe? Ponieważ każdy element zestawu jest inny. – Levi

+0

@Levi Prawidłowe. Dlatego zamiast 'NSSet' należy użyć' NSCountedSet'. – rmaddy

3

Proponuję rozwiązać obie tablice i porównać wyniki z metody próbowałem .

+1

To działałoby tylko wtedy, gdy wszystkie elementy są porównywalne, to np. niepowodzenie, jeśli tablica zawiera zarówno ciągi i liczby, jak i dowolne obiekty, które nie mają metody porównania. –

+0

@MartinR jest to możliwe, ale nie widziałem nikogo, kto chciałby porównać 2 tablice z wieloma typami danych. Jak porównałbyś je w takim przypadku? – Levi

+1

Wszystkie obiekty implementują 'hash' i' isEqual' (i właśnie to [NSSet setWithArray: ...] 'lub lepiej' [NSCountedSet setWithArray: ...] 'używa), dzięki czemu metoda działa z dowolnymi obiektami. –