我有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");
}
以上代码正在打印'不等于',但应打印'等于'。我怎么能这样做?
答案 0 :(得分:35)
这两个数组不相等。两个数组相同,它们都具有相同顺序的相同对象。
如果您想进行比较而不考虑订单,那么您需要使用两个NSSet
个对象。
NSSet *set1 = [NSSet setWithArray:arr1];
NSSet *set2 = [NSSet setWithArray:arr2];
if ([set1 isEqualToSet:set2]) {
// equal
}
答案 1 :(得分:15)
这里的大部分答案实际上并不适用于相当常见的情况(请参阅他们的评论)。有一个非常好的数据结构可以解决这个问题: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);
答案 2 :(得分:9)
试试这个。我正在做的是复制你的第一个阵列&从第二个数组中删除复制元素。如果它是空的然后它相等,否则不相等。
这比@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
- source。
UPDATE2:更新以使答案更全面,因为一个阵列比其他阵列更大。
答案 3 :(得分:5)
就像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];
}
答案 4 :(得分:1)
我找到了解决方案,我们可以通过对数组元素进行排序来实现这个目标
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");
}
答案 5 :(得分:1)
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.
答案 6 :(得分:0)
另一种选择是将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;
}
我对所有这些方法的性能比较感到好奇。