2013-03-31 158 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:...]'使用),因此该方法适用于任意对象。 –