如何通过过滤匹配条件从NSArray创建范围?

时间:2018-11-14 00:55:10

标签: ios objective-c 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也可能有用,但是我不确定执行此操作的最佳方法。

1 个答案:

答案 0 :(得分:0)

NSIndexSet并没有真正的帮助,因为您是在范围内,而不是索引后。

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

除了NSRange是一个结构,因此不能将实例直接添加到NSMutableArray。有几种选择:

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

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

Range.h

@interface Range : NSObject

@property (readonly) NSRange range;

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

Range.m

导入“ Range.h”

@实现范围

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

    return self;
}

@end

YourCode.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;
}