You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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},需完成两个查找:

  1. 找到紧邻myRange的前序NSRange(即结束位置不超过myRange起始位置的最后一个范围)
  2. 找到第一个下界大于myRange上界(105+148=253)的后序NSRange

预期结果:前序范围{90, 14},后序范围{254, 1}

核心逻辑

  1. 计算关键边界:先算出myRange的上界为253,以及myRange的起始位置105
  2. 前序范围查找:遍历数组,记录所有结束位置(location + length)小于等于105的范围,取最后一个即可(数组按位置顺序排列)
  3. 后序范围查找:遍历数组,找到第一个起始位置大于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:20:12