如何在NSRange数组中查找指定myRange的前序及符合要求的后序NSRange
查找紧邻指定NSRange的前后范围
问题描述
给定NSRange数组:[{0, 31}, {32, 29}, {62, 10}, {73, 15}, {89, 0}, {90, 14}, {105, 22}, {128, 26}, {155, 15}, {171, 17}, {189, 22}, {212, 15}, {228, 18}, {247, 3}, {251, 2}, {254, 1}, {256, 0}, {257, 24}, {282, 22}]
指定目标范围myRange = {105, 148},需完成两个查找:
- 找到紧邻
myRange的前序NSRange(即结束位置不超过myRange起始位置的最后一个范围) - 找到第一个下界大于
myRange上界(105+148=253)的后序NSRange
预期结果:前序范围{90, 14},后序范围{254, 1}
核心逻辑
- 计算关键边界:先算出
myRange的上界为253,以及myRange的起始位置105 - 前序范围查找:遍历数组,记录所有结束位置(
location + length)小于等于105的范围,取最后一个即可(数组按位置顺序排列) - 后序范围查找:遍历数组,找到第一个起始位置大于
253的范围,一旦找到就停止遍历,保证是第一个符合条件的
实现代码(Objective-C)
NSArray<NSValue *> *rangeArray = @[ [NSValue valueWithRange:NSMakeRange(0, 31)], [NSValue valueWithRange:NSMakeRange(32, 29)], [NSValue valueWithRange:NSMakeRange(62, 10)], [NSValue valueWithRange:NSMakeRange(73, 15)], [NSValue valueWithRange:NSMakeRange(89, 0)], [NSValue valueWithRange:NSMakeRange(90, 14)], [NSValue valueWithRange:NSMakeRange(105, 22)], [NSValue valueWithRange:NSMakeRange(128, 26)], [NSValue valueWithRange:NSMakeRange(155, 15)], [NSValue valueWithRange:NSMakeRange(171, 17)], [NSValue valueWithRange:NSMakeRange(189, 22)], [NSValue valueWithRange:NSMakeRange(212, 15)], [NSValue valueWithRange:NSMakeRange(228, 18)], [NSValue valueWithRange:NSMakeRange(247, 3)], [NSValue valueWithRange:NSMakeRange(251, 2)], [NSValue valueWithRange:NSMakeRange(254, 1)], [NSValue valueWithRange:NSMakeRange(256, 0)], [NSValue valueWithRange:NSMakeRange(257, 24)], [NSValue valueWithRange:NSMakeRange(282, 22)] ]; NSRange myRange = NSMakeRange(105, 148); NSUInteger myUpperBound = myRange.location + myRange.length; NSValue *prevRange = nil; NSValue *nextRange = nil; for (NSValue *rangeVal in rangeArray) { NSRange current = rangeVal.rangeValue; NSUInteger currentUpper = current.location + current.length; // 更新前序范围:只要当前范围结束在myRange起始前,就替换为当前(保证取最后一个符合的) if (currentUpper <= myRange.location) { prevRange = rangeVal; } // 查找第一个符合条件的后序范围,找到后不再更新 if (!nextRange && current.location > myUpperBound) { nextRange = rangeVal; } } // 输出结果 NSLog(@"前序NSRange: %@", NSStringFromRange(prevRange.rangeValue)); NSLog(@"后序NSRange: %@", NSStringFromRange(nextRange.rangeValue));
输出结果
前序NSRange: {90, 14} 后序NSRange: {254, 1}
内容的提问来源于stack exchange,提问作者Hassan Taleb
相关产品推荐
相关产品推荐

