在NSArray上进行二进制枚举运算。完全经过单元测试。
NSArray的二进制枚举方法仅在处理对象相等时有效
- (NSUInteger)indexOfObject:(id)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator)cmp
有时,您可能希望在排序数组的二进制枚举中获取性能提升,而无需确保对象相等。可能无法或不需要覆盖isEqual:
以允许对象相等。例如,在一个散列集合中,您无法通过hashCode
表示交集
您可能有一个包含大量按位置排序的项目布局信息的对象。为了获取特定查询矩形的布局信息,您可以使用线性枚举,但这会更高效地使用二分搜索。由于需要对象相等,因此不能使用标准的NSArray
方法,您可以使用LLBinaryOperators获取与查询矩形相交的布局信息。
使用类别方法。
- (void) ll_binaryEnumerate:(MI9BinaryEnumerationBlock)block;
您可以使用以下方法获取与X维度最低值相交的矩形
NSArray * arrayOfCGRects = ....;
CGRect intersectionRect = ....;
__block NSUInteger intersectionIndex = NSNotFound;
[arrayOfCGRects ll_binaryEnumerate:NSComparisonResult^(NSUInteger index, LayoutInformation * object, NSRange range, BOOL * stop) {
CGRect * rect = [object bounds];
if(CGRectIntersectsRect(rect, intersectionRect) {
intersectionIndex = index;
*stop = YES;
// Enumerates downwards
return NSOrderedDescending;
} else if (CGRectGetMinX(rect) > CGRectGetMaxX(intersectionRect)) {
return NSOrderedAscending;
} else if (CGRectGetMaxX(rect) < CGRectGetMinX(intersectionRect)) {
return NSOrderedDescending;
}
*stop = YES;
return NSOrderedSame;
}];
我们有了最左边的索引,现在线性向上枚举,直到我们遇到最右边的索引
NSMutableArray * intersectionObjects = [NSMutableArray array];
if(intersectionIndex != NSNotFound) {
[arrayOfCGRects enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(intersectionIndex, [array count] - indersectionIndex)] options:0 usingBlock:^(SomeObject * obj, NSUInteger idx, BOOL *stop) {
if(CGRectIntersectsRect([obj bounds], intersectionRect)) {
[intersectionObjects addObject:obj];
return;
}
*stop = YES;
}];
NSLog(@"Objects %@ intersect rect %@", intersectionObjects, NSStringFromCGRect(intersectionRect));
}