ios - 检查一个数组是否包含另一个数组的相同对象的最快方法

标签 ios objective-c nsarray fast-enumeration

目标是比较两个数组并检查它们是否包含相同的对象(尽可能快 - 数组中有很多对象)。无法使用 isEqual: 检查数组,因为它们的排序方式不同。

我已经尝试过此处发布的解决方案(https://stackoverflow.com/a/1138417 - 请参阅 Peter Hosey 发布的最后一个代码片段)。但这不适用于不同排序的数组。

我现在使用的代码如下:

+ (BOOL)arraysContainSameObjects:(NSArray *)array1 andOtherArray:(NSArray *)array2 {
    // quit if array count is different
    if ([array1 count] != [array2 count]) return NO;

    BOOL bothArraysContainTheSameObjects = YES;
    for (id objectInArray1 in array1) {
        BOOL objectFoundInArray2 = NO;
        for (id objectInArray2 in array2) {
            if ([objectInArray1 isEqual:objectInArray2]) {
                objectFoundInArray2 = YES;
                break;
            }
        }
        if (!objectFoundInArray2) {
            bothArraysContainTheSameObjects = NO;
            break;
        }
    }

    return bothArraysContainTheSameObjects;
}

这行得通,但那是两个嵌套的快速枚举。有没有办法进行更快的比较?

最佳答案

根据您的代码,您严格要求元素数量相同,并且第一个数组的每个对象都应该在第二个数组中,反之亦然。

最快的方法是对数组进行排序并比较它们。

例如:

NSArray *array1=@[@"a",@"b",@"c"];
NSArray *array2=@[@"c",@"b",@"a"];

array1=[array1 sortedArrayUsingSelector:@selector(compare:)];
array2=[array2 sortedArrayUsingSelector:@selector(compare:)];

if ([array1 isEqualToArray:array2]) {
    NSLog(@"both have same elements");
}
else{
    NSLog(@"both having different elements");
}

关于ios - 检查一个数组是否包含另一个数组的相同对象的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14935233/

相关文章:

ios - 如何在范围内暂停信标的通知?

iOS Objective-Zip 损坏问题

iphone - 根据多个属性对NSArray进行排序

objective-c - 检查 NSString 是否存在于 NSArray 中的自定义对象中

ios - 将 UIButton 旋转 360 度

ios - iOS聊天应用程序如何在后台保持运行?

ios - 如何根据数组中包含的字符串隐藏特定的 UIButton

ios - -[UITableView _configureCellForDisplay :forIndexPath:],/SourceCache/UIKit/UIKit-2935.137/UITableView.m:6509 断言失败

ios - 使用新的身份验证重新启动 RKObjectRequestOperation

objective-c - 带字典的 NSSet : Get object by Value of Key