长范围值查找:基于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
相关产品推荐
相关产品推荐

