2013-03-31 157 views
5

在類NSArray中,有一個方法isEqualToArray:比較兩個數組並指出它們是否匹配。比較兩個數組忽略順序

我有兩個數組有不同順序的元素。例如:

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

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

在上述例子中,即使arr1arr2具有相同的要素,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]; 

編輯:

如果您有ARR1和ARR2重複,然後使用:

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

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

請注意,這隻有在保證兩個陣列中沒有重複的情況下才有效。如果可能有重複的值,'NSCountedSet'應該處理事情。 – rmaddy

+0

用你的方法是不是陣列(一,二,一,三)和(三,二,一)是相等的?由於Set的每個元素都不相同。 – Levi

+0

@Levi正確。這就是爲什麼'NSCountedSet'應該用來代替'NSSet'。 – rmaddy

3

我建議你兩個數組排序,並將結果與​​你試過的方法比較。

+1

只有所有元素都具有可比性,它纔會起作用。如果數組包含字符串和數字,或者沒有比較方法的任意對象,則失敗。 –

+0

@MartinR有可能,但我沒有看到誰想要比較2個數組與多種數據類型。在這種情況下你會如何比較它們? – Levi

+1

所有對象實現'hash'和'isEqual'(這就是'[NSSet setWithArray:...]'或更好'[NSCountedSet setWithArray:...]'使用),因此該方法適用於任意對象。 –