gpt4 book ai didi

ios - 如何从NSIndexSet筛选和创建范围?

转载 作者:行者123 更新时间:2023-12-01 22:11:02 26 4
gpt4 key购买 nike

我有一个NSIndexSet由创建

NSIndexSet* groups = [self.specifiers indexesOfObjectsPassingTest:^(PSSpecifier*specifier, NSUInteger idx, BOOL *stop) {
return [(NSString*)[specifier.properties objectForKey:@"cell"] isEqualToString:@"KBGroupCell"]; }];
可能看起来像这样: (0 3 5 8-9 12 14 17-19),并且最大为25。
我希望过滤并创建范围,以便获得类似以下的输出:
0-2
3-4
5-7
8-11
12-13
14-16
17-25
使用的数组由用户而非我自己填充。 KBGroupCells用于填充表中的页眉和页脚,因此不应连续识别。稍后填充表格时,我需要记住被忽略的数字(9、18和19)。
通过使用 rangeAtIndex,我可以识别集合中包含多个的范围,因此可以用于查找要忽略的数字。
我该如何实现?

最佳答案

我假设您有NSIndexSet:

    let original =   IndexSet(arrayLiteral: 0, 3, 5).union(IndexSet(integersIn: 8...9)).union( IndexSet.init(arrayLiteral: 12,14)).union(IndexSet(integersIn: 17...19)).union(IndexSet.init(arrayLiteral: 26,27))
let nsIndex = original as! NSIndexSet

将其转换为IndexSet之后,您可以轻松获得两个数组。一个是[NSRange],另一个是[closedRange]
    let index = nsIndex as! IndexSet
let rangeView = index.rangeView
print ( Array(rangeView.enumerated().map{
NSRange.init(location:($0.element.first!) , length: ((rangeView[$0.offset + 1].first! - ($0.element.first!))))
}.dropLast()))

print ( Array(rangeView.enumerated().map{
($0.element.first!)...(rangeView[$0.offset + 1].first!) - 1
}.dropLast()))

如果是客观的-C。像这样:
NSMutableIndexSet * nsIndex =    [[NSMutableIndexSet alloc] init];
[nsIndex addIndex: 0];
[nsIndex addIndex: 3];
[nsIndex addIndex: 5];
[nsIndex addIndexesInRange:NSMakeRange(8, 2)];
[nsIndex addIndex: 12];
[nsIndex addIndex: 14];
[nsIndex addIndexesInRange:NSMakeRange(17, 3)];
[nsIndex addIndex: 26];
__block int count = 0;
__block NSMutableArray * ranges = [NSMutableArray array];
[nsIndex enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
count ++;
[ranges addObject:[NSValue valueWithRange: range]];
}];
NSMutableArray * result = [NSMutableArray array];
for (NSUInteger location = 0 ; location < count - 1 ; location++) {
NSUInteger loc = ((NSValue *) ranges[location]).rangeValue.location;
[result addObject:[NSValue valueWithRange: (NSMakeRange( loc, ((NSValue *) ranges[location + 1]).rangeValue.location - loc))]];
}
NSLog(result.description);

或一轮:
__block NSUInteger temp = nsIndex.firstIndex;
__block NSMutableArray * result = [NSMutableArray array];
[nsIndex enumerateRangesWithOptions:NSEnumerationReverse usingBlock:^(NSRange range, BOOL * _Nonnull stop) {
[result insertObject: [NSValue valueWithRange: NSMakeRange(range.location, temp - range.location)] atIndex:0];
temp = range.location ;
}];
result = [result subarrayWithRange:NSMakeRange(0, result.count - 1)];
NSLog(result.description);

关于ios - 如何从NSIndexSet筛选和创建范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com