首页 > 解决方案 > 如何通过过滤匹配条件从 NSArray 创建范围?

问题描述

NSArray *objects = @[object1, object2, object3, object1, object5, object1, object6, object7];

如何最好地获得由 object1 分隔的范围,如下所示:

(0-2 3-4 5-7)

我知道这种从数组创建 NSIndexSet 的方法,但我不确定如何使用它来实现上述索引集。

NSIndexSet*indexSet = [objects indexesOfObjectsPassingTest:^(id object, NSUInteger idx, BOOL *stop) {
    return ; //Do some checks
}];

使用 objects.count 也可能对最终范围有用,但我不确定这样做的最佳方法。

标签: iosobjective-cnsarray

解决方案


AnNSIndexSet不会真正有帮助,因为您追求的是范围,而不是索引。

您可以简单地遍历数组以查找您的哨兵对象object1,将实例添加NSRange到数组中。

除了,这NSRange是一个结构,所以你不能直接将实例添加到NSMutableArray. 有几个选项:

  1. (这将是我的第一选择):使用 Swift 而不是 Objective-C
  2. 创建要包装的自定义对象NSRange
  3. 用来NSValue包裹NSRange
  4. 使用 C 数组而不是NSArray

我将使用选项 2,因为选项 3 涉及弄乱底层结构的原始字节。

范围.h

@interface Range : NSObject

@property (readonly) NSRange range;

- (id) initWithRange: (NSRange) range
@end

范围.m

导入“范围.h”

@实现范围

- (id) initWithRange: (NSRange) range {
    if (self = [super init]) {
        _range = range;
    }
    
    return self;
}

@end

你的代码.m

-(NSArray *) getRanges:(NSArray *)objects delimeter: (NSObject *)object1 
{
    int rangeStart = -1;
    NSMutableArray *ranges = [[NSMutableArray alloc]init];
    int index;
    
    for (index=0; index<objects.count;index++) {
        if (objects[index] == object1) {
            if (rangeStart != -1) {
                Range *range = [[Range alloc] initWithRange:NSMakeRange(rangeStart,index-rangeStart)];
                [ranges addObject:range];
            }
            rangeStart = index;
        }
    }
    
    if (rangeStart != -1) {
        Range *range = [[Range alloc] initWithRange:NSMakeRange(rangeStart,index-rangeStart)];
        [ranges addObject:range];
    }
    return ranges;
}

推荐阅读