ios - 如何通过过滤匹配条件从 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 也可能对最终范围有用,但我不确定这样做的最佳方法。
解决方案
AnNSIndexSet
不会真正有帮助,因为您追求的是范围,而不是索引。
您可以简单地遍历数组以查找您的哨兵对象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
导入“范围.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;
}
推荐阅读
- apache -
导致我们的 Apache 服务器产生“内部错误” - jakarta-ee - 在多页面应用程序中使用带有 javaee 容器(wildfly)的 vue
- json - Postgres函数返回未知数量的列
- visual-studio-code - 在 VSCode 中,如何像在 WebStorm 中一样选择当前元素及其周围环境?
- python - 如何在 StyledTextCtrl 中创建查找对话框?
- c# - 简单的 c# 在 AWS 存储桶中放置和获取单个日志行
- angular - RxJS : 使用另一个 observable 过滤一个 observable
- javascript - 循环在 2 个不同区域重复时该怎么办
- php - Laravel Artisan 从错误的项目加载
- python - 我在文本文件中有一些数据,我应该如何解析我只会得到“isakm”和“esp”值的文档?