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

长范围值查找:基于Long类型实现匹配返回对应值的技术咨询

我来帮你完善这个Long类型的范围查找实现,先梳理下你现有代码的问题,再给出完整的可运行方案:

Long类型范围查找实现方案

你的需求是将Long类型的值在指定范围内匹配并返回对应结果,且所有值都设为Long类型避免错误。先看看你已有的代码片段:

现有代码片段

Range类

package RestClient;
public class Range {
    public static Long upper;
    public static Long value;
    public Range(Long i, Long j) {
        Range.upper = i;
        Range.value = j;
    }
}

未完成的Rangelookup类

package RestClient;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
public class Rangelookup {
    public static String... // 此处代码未完成
}

现有代码的问题

  • Range类使用了static变量,这会导致所有Range实例共享同一组upper和value,完全无法独立存储不同的范围规则。
  • Rangelookup类还未实现核心的范围查找逻辑,且返回值类型看起来和需求的Long结果不匹配。

优化后的完整实现

修正Range类(改为实例变量存储)

package RestClient;

public class Range {
    private final Long upper;
    private final Long value;

    // 构造方法初始化范围上限和对应结果
    public Range(Long upperBound, Long resultValue) {
        this.upper = upperBound;
        this.value = resultValue;
    }

    // 提供getter方法访问私有变量
    public Long getUpper() {
        return upper;
    }

    public Long getValue() {
        return value;
    }
}

完整实现RangeLookup类(基于NavigableMap实现高效查找)

package RestClient;

import java.util.NavigableMap;
import java.util.TreeMap;

public class RangeLookup {
    private final NavigableMap<Long, Long> rangeMap;

    // 初始化有序映射,用于存储范围上限和对应结果
    public RangeLookup() {
        rangeMap = new TreeMap<>();
    }

    // 添加范围规则:传入区间上限和对应结果值
    public void addRange(Range range) {
        if (range == null || range.getUpper() == null || range.getValue() == null) {
            throw new IllegalArgumentException("Range及内部参数不能为null");
        }
        rangeMap.put(range.getUpper(), range.getValue());
    }

    // 核心查找方法:传入目标Long值,返回匹配的结果
    public Long lookup(Long target) {
        if (target == null) {
            throw new IllegalArgumentException("目标值不能为null");
        }
        // 找到第一个大于等于目标值的范围上限,返回对应结果
        var matchedEntry = rangeMap.ceilingEntry(target);
        return matchedEntry != null ? matchedEntry.getValue() : null;
    }

    // 示例用法
    public static void main(String[] args) {
        RangeLookup lookup = new RangeLookup();
        lookup.addRange(new Range(50L, 10L));
        lookup.addRange(new Range(100L, 20L));
        lookup.addRange(new Range(200L, 30L));

        System.out.println(lookup.lookup(30L));  // 输出10(匹配上限50的区间)
        System.out.println(lookup.lookup(75L));  // 输出20(匹配上限100的区间)
        System.out.println(lookup.lookup(250L)); // 输出null(无匹配的范围)
    }
}

关键说明

  • 去掉static变量:修正后的Range类用实例变量存储每个范围的上限和结果,确保多范围规则不会互相干扰。
  • 高效查找逻辑:利用TreeMap实现的NavigableMap接口,ceilingEntry方法可以快速定位到第一个大于等于目标值的范围上限,时间复杂度为O(log n),适合大量范围规则的场景。
  • 空值校验:在添加范围和查找时都做了空值判断,避免出现NullPointerException。

内容的提问来源于stack exchange,提问作者Squeez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:58:32