如何通过过滤匹配条件从 NSArray 创建范围?
Posted
技术标签:
【中文标题】如何通过过滤匹配条件从 NSArray 创建范围?【英文标题】:How to create ranges from NSArray by filtering matching conditions? 【发布时间】:2018-11-14 00:55:10 【问题描述】: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-2、3-4 和 5-7 吗?我不认为NSIndexSet
是你想要的。你想要一个NSRange
的数组。您只需要遍历数组,构建范围。
对于索引集,(0-2 3-4 5-7)和(0-7)之间没有真正的区别。索引要么在集合中,要么不在集合中。没有“分组”。
@Paulw11 你说得对。我已经修复了问题主体并更改了问题以允许其他可能的解决方案。
@KaneBuckthorpe 您已经删除了您希望范围由object1
分隔的事实。
@KenThomases 实际上有一些分组,因为 rangeAtIndex 可用于 NSIndexSet 以返回 NSIndexSet 索引的范围
【参考方案1】:
NSIndexSet
并没有真正的帮助,因为您关注的是范围,而不是索引。
您可以简单地遍历数组以查找您的标记对象object1
,将NSRange
的实例添加到数组中。
除了NSRange
是一个结构体,所以不能直接向NSMutableArray
添加实例。有几个选项:
-
(这将是我的首选):使用 Swift 而不是 Objective-C
创建一个自定义对象来包装
NSRange
使用NSValue
包裹NSRange
使用 C 数组而不是 NSArray
我将使用选项 2,因为选项 3 涉及弄乱底层结构的原始字节。
范围.h
@interface Range : NSObject
@property (readonly) NSRange range;
- (id) initWithRange: (NSRange) range
@end
范围.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;
【讨论】:
NSRange
不是对象。无法将其添加到 NSArray
。您可以将其包装在 NSValue
中,但这很麻烦。以上是关于如何通过过滤匹配条件从 NSArray 创建范围?的主要内容,如果未能解决你的问题,请参考以下文章