【发布时间】:2013-02-02 19:41:36
【问题描述】:
目标是比较两个数组并检查它们是否包含相同的对象(尽可能快 - 数组中有很多对象)。无法使用 isEqual: 检查数组,因为它们的排序方式不同。
我已经尝试过此处发布的解决方案(https://stackoverflow.com/a/1138417 - 请参阅 Peter Hosey 帖子的最后一个代码 sn-p)。但这不适用于不同排序的数组。
我现在使用的代码如下:
+ (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;
}
这可行,但这是两个嵌套的快速枚举。有没有办法进行更快的比较?
【问题讨论】:
-
您是否还必须验证它具有相同数量的匹配对象?例如,如果数组 1 有 2 个 X 实例,但数组 2 只有 1 则它会失败?
-
是的,这也应该验证。
-
在这种情况下,您别无选择,只能对它们进行排序并进行比较。
-
这有帮助吗:cocoabuilder.com/archive/cocoa/… -
- (unsigned)numberOfDistinctObjects { return [[NSSet setWithArray:self] count]; } -
嗯,这个比较是O(n),加上排序算法的效率。
标签: ios objective-c nsarray fast-enumeration