LLBinaryOperators 0.1

LLBinaryOperators 0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

未申报维护。



  • 作者:
  • Lawrence Lomax

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