2013-03-31 50 views
5

NSArray sınıfında, iki diziyi karşılaştıran ve eşleşip eşleşmediklerini belirten bir yöntem isEqualToArray: vardır.Siparişi göz ardı eden iki diziyi karşılaştırma

Farklı düzende öğeleri olan iki dizim var. Örneğin: Yukarıdaki örnekte

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

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

, olsa bile arr1 ve arr2 elemanlar aynı olması, isEqualToArray:NO dönüyor. Yukarıda belirtildiği gibi iki diziyi, for//while döngüsünde yineleme olmadan nasıl karşılaştırabilirim?

+0

MartinR'nin bunun en akıllı cevabı: http://stackoverflow.com/questions/15709494/compare-two-arrays-with-the-same-value-but-with-a-different-order – Monolo

cevap

7

NSSet kullanın ve karşılaştırın.

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

BOOL same=[set1 isEqualToSet:set2]; 

DÜZENLEME:

Eğer arr1 ve ARR2 çiftleri varsa, o kullanın:

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

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

Bunu unutmayın. her iki dizide de çoğaltmanın bulunmadığı garanti edilirse çalışır. Yinelenen değerler varsa, bir 'NSCountedSet' şeylere dikkat etmelidir. – rmaddy

+0

Sizin yönteminizle diziler (bir, iki, bir, üç) ve (üç, iki, bir) eşit olmaz mı? Bir Set'in her elemanı farklı olduğu için. – Levi

+0

@Levi Doğru. Bu nedenle 'NSSet' yerine 'NSCountedSet' kullanılmalıdır. – rmaddy

3

Önerim her iki diziler sıralamak ve denedim yöntemi ile sonuçları karşılaştırmak .

+1

Bu yalnızca tüm öğeler karşılaştırılabilir olduğunda işe yarardı, örn. dizi hem dizeleri hem de sayıları veya karşılaştırma yöntemi olmayan rasgele nesneleri içeriyorsa başarısız olur. –

+0

@MartinR mümkündür, ancak birden fazla veri türü ile 2 diziyi karşılaştırmak isteyen kimseyi görmedim. Onları bu durumda nasıl karşılaştırırsınız? – Levi

+1

Tüm nesneler 'hash' ve' isEqual '(ve bu [NSSet setWithArray: ...] 'veya daha iyi' [NSCountedSet setWithArray: ...] ') işlevini kullanır, böylece yöntem rasgele nesnelerle çalışır. –

İlgili konular