如何比较2 nsarray

我有2个Nsarray,其中2个数组的对象是相同的,可能是对象的索引不同,但是它应该打印出来的都是相等的,

NSArray *arr1 = [[NSArray alloc]initWithObjects:@"aa",@"bb",@"1",@"cc", nil]; NSArray *arr2 = [[NSArray alloc]initWithObjects:@"bb",@"cc",@"1",@"aa", nil]; if([arr1 isEqualToArray:arr2]) { NSLog(@"equal"); } else { NSLog(@"Not equal"); } 

上面的代码打印“不相等”,但它应该打印“平等” ,我怎么能做到这一点

这两个数组不相等。 两个数组是相同的,他们都有相同的顺序相同的对象。

如果你想比较不考虑顺序,那么你需要使用两个NSSet对象。

 NSSet *set1 = [NSSet setWithArray:arr1]; NSSet *set2 = [NSSet setWithArray:arr2]; if ([set1 isEqualToSet:set2]) { // equal } 

这里的大部分答案实际上不适用于相当常见的情况(请参阅他们的评论)。 有一个非常好的数据结构可以解决这个问题: NSCountedSet 。

计数的集合是无序的,但不在乎目前的项目数量,所以你不会以@[1, @1, @2] == @[@1, @2, @2]

 NSArray *array1 = @[@1, @1, @2]; NSArray *array2 = @[@1, @2, @2]; NSCountedSet *set1 = [[NSCountedSet alloc] initWithArray:array1]; NSCountedSet *set2 = [[NSCountedSet alloc] initWithArray:array2]; BOOL isEqual = [set1 isEqualToSet:set2]; NSLog(@"isEqual:%d", isEqual); 

尝试这个。 我正在做的是复制你的第一个数组,并从第二个数组中删除拷贝元素。 如果它的空白,那么它是平等的,否则不等于。

这比@rmaddy解决scheme的记忆足迹要less。 您只创build一个数组而不是两个数组的副本…

 NSMutableArray *copyArray; if([arr1 count] >= [arr2 count]) { copyArray = [NSMutableArray arrayWithArray:arr1]; [copyArray removeObjectsInArray:arr2]; } else //c(arr2) > c(arr1) { copyArray = [NSMutableArray arrayWithArray:arr2]; [copyArray removeObjectsInArray:arr1]; } if([copyArray count] != 0) NSLog('Not Equal'); else NSLog('Equal'); 

UPDATE1:如果你想在这之后使用arr2 ,那么它被改变了。 你需要复制它,然后在这种情况下,记忆方式与rmaddy解决scheme相同。 但是这个解决scheme仍然是优越的,因为NSSet创build时间远远超过NSArray – 源 。

更新2:更新以使答案更全面,一个数组比其他更大。

就像rmaddy所说,那些NSArrays是不一样的。 尝试这个:

 -(BOOL)compareArrayIgnoreIndexes:(NSArray*)arrayOne toArray:(NSArray*)arrayTwo{ NSSet *setOne=[[NSSet alloc]initWithArray:arrayOne]; NSSet *setTwo=[[NSSet alloc]initWithArray:arrayTwo]; return [setOne isEqualToSet:setTwo]; } 

我find了解决scheme,我们可以通过sorting数组元素来实现

  NSArray *arr1 = [[NSArray alloc]initWithObjects:@"a2223a",@"ab33b",@"a1acdf",@"ac23c45", nil]; NSArray *arr11 = [arr1 sortedArrayUsingSelector:@selector(localizedCompare:)]; NSArray *arr2 = [[NSArray alloc]initWithObjects:@"ab33b",@"ac23c45",@"a1acdf",@"a2223a", nil]; NSArray *arr22= [arr2 sortedArrayUsingSelector:@selector(localizedCompare:)]; if([arr11 isEqualToArray:arr22]) { NSLog(@"equal"); } else { NSLog(@"Not equal"); } 
 This can be done by using one NSMutableArray.The main point to be remembered is that the larger array should be saved in NSMutableArray. Otherwise it wont work as expected. The code is given below. NSArray *array1 = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]; NSArray *array2 = [NSArray arrayWithObjects:@"Two", @"Three", @"One", nil]; NSMutableArray *intermediate = [NSMutableArray arrayWithArray:array1]; [intermediate removeObjectsInArray:array2]; NSUInteger difference = [intermediate count];//returns the number of difference between two arrays. 

另一种select是将NSArrays转换为JSONstring,并使用isEqualToString进行比较。

 -(BOOL)isArray:(NSArray *)firstArray equalContentsToArray:(NSArray *)secondArray { if (!firstArray) { firstArray=@[]; } if (!secondArray) { secondArray=@[]; } NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:firstArray options:0 error:&error]; NSString *jsonStringOne = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; jsonData = [NSJSONSerialization dataWithJSONObject:secondArray options:0 error:&error]; NSString *jsonStringTwo = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; BOOL isEqual=NO; if ([jsonStringOne isEqualToString:jsonStringTwo]) { isEqual=YES; } return isEqual; } 

我很好奇所有这些方法的性能比较。

Interesting Posts