2013-03-31 15 views
5

Nella classe NSArray, esiste un metodo isEqualToArray: che confronta due array e indica se corrispondono o meno.Confronto tra due array che ignorano l'ordine

Ho due array con elementi in ordine diverso. Ad esempio:

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

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

Nell'esempio sopra, anche se arr1 e arr2 hanno stessa gli elementi, isEqualToArray: sta tornando NO. Come posso confrontare due array come sopra menzionato senza iterare attraverso ogni elemento in un ciclo for/while?

+0

Vedere la risposta intelligente di MartinR a questo: http://stackoverflow.com/questions/15709494/compare-two-arrays-with-the-same-value-but-with-a-different-order – Monolo

risposta

7

Utilizzare NSSet e quindi confrontare.

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

BOOL same=[set1 isEqualToSet:set2]; 

EDIT:

Se si dispone di duplicati in arr1 e arr2, quindi utilizzare:

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

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

Si noti che questo funziona solo se è garantito che non ci sono duplicati in nessuno degli array. Un 'NSCountedSet' dovrebbe occuparsi delle cose se potrebbero esserci valori duplicati. – rmaddy

+0

Con il tuo metodo, gli array (uno, due, uno, tre) e (tre, due, uno) non saranno uguali? Poiché ogni elemento di un Set è diverso. – Levi

+0

@Levi corretto. Questo è il motivo per cui dovrebbe essere usato 'NSCountedSet' al posto di' NSSet'. – rmaddy

3

vi consiglio di ordinare entrambi gli array, e confrontare i risultati con il metodo che hai provato .

+1

Questo funzionerebbe solo se tutti gli elementi sono comparabili, ad es. fallire se la matrice contiene sia stringhe e numeri, sia oggetti arbitrari che non hanno un metodo di confronto. –

+0

@MartinR è possibile, ma non ho visto nessuno che volesse confrontare 2 matrici con più tipi di dati. Come li paragoneresti in quel caso? – Levi

+1

Tutti gli oggetti implementano 'hash' e' isEqual' (e questo è ciò che '[NSSet setWithArray: ...]' o meglio '[NSCountedSet setWithArray: ... ]' utilizza), in modo che il metodo funzioni con oggetti arbitrari. –