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也可能有用,但是我不确定执行此操作的最佳方法。
答案 0 :(得分:0)
NSIndexSet
并没有真正的帮助,因为您是在范围内,而不是索引后。
您可以简单地遍历数组以查找哨兵对象object1
,将NSRange
的实例添加到数组中。
除了NSRange
是一个结构,因此不能将实例直接添加到NSMutableArray
。有几种选择:
NSRange
NSValue
包装NSRange
NSArray
我将使用选项2,因为选项3涉及弄乱基础结构的原始字节。
@interface Range : NSObject
@property (readonly) NSRange range;
- (id) initWithRange: (NSRange) range
@end
@实现范围
- (id) initWithRange: (NSRange) range {
if (self = [super init]) {
_range = range;
}
return self;
}
@end
-(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;
}