如何通过过滤匹配条件从 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 创建范围?的主要内容,如果未能解决你的问题,请参考以下文章

从 NSArray 过滤 NSDictionary

如何根据 nsarray 过滤谓词

如何通过键过滤 NSArray:值,即在 NSDictionary

C语言如何实现满足多条件匹配简单过滤问题

从 NSArray 动态生成 NSPredicate

NSPredicate的使用