如何比较两个NSArrays平等的内容?(How to compare two NSArrays f

2019-08-03 20:59发布

我有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");
}

上面的代码是印刷“不等于”,但它应该打印“等于”。 我怎样才能做到这一点?

Answer 1:

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

如果你想完全不考虑比较订购,那么你需要使用两个NSSet的对象。

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

if ([set1 isEqualToSet:set2]) {
    // equal
}


Answer 2:

大部分的答案在这里居然没有为相当常见的情况(见他们的评论)工作。 还有,将解决这个问题一个很好的数据结构: 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);


Answer 3:

试试这个。 我做的是让你的第一个阵列的复制和从第二数组中删除复制的元素。 如果它为空,则其相等,否则不相等。

这有较小的内存占用比@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:更新,使柜面回答一个阵列更全面的比其他更大。



Answer 4:

就像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];
}


Answer 5:

我找到了解决办法,,我们可以通过排序数组中的元素实现这一目标

 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");
    }


Answer 6:

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.


Answer 7:

另一种选择是将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;
}

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



文章来源: How to compare two NSArrays for equal content?