如何比较两个同等内容的NSArray?

Rav*_*avi 15 equals objective-c nsmutablearray nsarray ios

我有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");
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印'不相等', 但它应打印'等于'.我怎样才能做到这一点?

rma*_*ddy 35

这两个数组不相等.两个数组相同,它们都以相同的顺序具有相同的对象.

如果要进行比较而不考虑订单,则需要使用两个NSSet对象.

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

if ([set1 isEqualToSet:set2]) {
    // equal
}
Run Code Online (Sandbox Code Playgroud)

  • 备注:此方法忽略重复,例如`@ [@ 1,@ 2]`和`@ [@ 1,@ 1,@ 2,@ 2]`被认为是相等的.但是,从这个问题来看,这是否是理想行为并不明显. (11认同)

OC *_*ard 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);
Run Code Online (Sandbox Code Playgroud)

  • 刚刚意识到我原来的答案引用了mac docs,很抱歉这个混乱.该类也适用于iOS - 更新了答案以更正链接. (2认同)

Sri*_*aju 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');
Run Code Online (Sandbox Code Playgroud)

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

UPDATE2:更新以使答案更全面,因为一个阵列比其他阵列大.

  • 也许你打算调用`-removeObjectsFromArray:`,然后把'-count`比作0(有创造力,我喜欢它). (2认同)

dot*_*mis 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];
}
Run Code Online (Sandbox Code Playgroud)