如果听起来您想使用 a TreeMap,其中键是范围的底部,值是Range对象。
然后要识别正确的范围,只需使用该floorEntry()方法非常快速地获取最接近的(小于或等于)Range,它应该包含密钥,如下所示:
TreeMap<Integer, Range> map = new TreeMap<>();
map.put(1, new Range(1, 10));
map.put(11, new Range(11, 30));
map.put(31, new Range(31, 100));
// int key = 0; // null
// int key = 1; // Range [start=1, end=10]
// int key = 11; // Range [start=11, end=30]
// int key = 21; // Range [start=11, end=30]
// int key = 31; // Range [start=31, end=100]
// int key = 41; // Range [start=31, end=100]
int key = 101; // Range [start=31, end=100]
// etc.
Range r = null;
Map.Entry<Integer, Range> m = map.floorEntry(key);
if (m != null) {
r = m.getValue();
}
System.out.println(r);
由于树总是按底部范围边界的自然顺序排序,因此您的所有搜索最多将是 O(log(n))。
当您的键完全超出范围时,您需要添加一些完整性检查(例如,当它们的键超出地图的末尾时,它会返回地图中的最后一个Range),但这应该让您了解如何继续。