如何比较两个同等内容的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解决方案具有更小的内存占用量。 您只创建一个数组的副本,而不是两个数组…

 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解决方案相同。 但是这个解决方案仍然优越,因为NSSet创建时间远远超过NSArray – 源 。

UPDATE2:更新以使答案更全面,因为一个arrays比其他arrays大。

就像rmaddy说的那样,那些NSArray并不相同。 尝试这个:

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

我找到了解决方案,我们可以通过对数组元素进行排序来实现

  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. 

另一种选择是将NSArrays转换为JSON字符串,并使用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; } 

我对所有这些方法的性能比较感到好奇。