これは、ツリー構造を使用する自然な状況のようです。
残念ながら、java.util.Mapすべてのキーを返すメソッドが指定されているため、インターフェイスを実装することは実用的ではありません。あなたの状況では、理論的には非現実的な数のキーがあります。
ツリーの各ノードには、最小キー、最大キー、およびその範囲に関連付けられた値が必要です。次に、次に高い範囲と次に低い範囲を表すノードへのリンクを作成できます (存在する場合)。何かのようなもの:
public class RangeMap<K extends Comparable<K>, V> {
    protected boolean empty;
    protected K lower, upper;
    protected V value;
    protected RangeMap<K, V> left, right;
    public V get(K key) {
        if (empty) {
            return null;
        }
        if (key.compareTo(lower) < 0) {
            return left.get(key);
        }
        if (key.compareTo(upper) > 0) {
            return right.get(key);
        }
        /* if we get here it is in the range */
        return value;
    }
    public void put(K from, K to, V val) {
        if (empty) {
            lower = from;
            upper = to;
            value = val;
            empty = false;
            left = new RangeMap<K,V>();
            right = new RangeMap<K,V>();
            return;
        }
        if (from.compareTo(lower) < 0) {
            left.put(from, to, val);
            return;
        }
        if (to.compareTo(upper) > 0) {
            right.put(from, to, val);
            return;
        }
        /* here you'd have to put the code to deal with adding an overlapping range,
           however you want to handle that. */
    }
    public RangeMap() {
        empty = true;
    }
}
ツリーが提供できるよりも高速なルックアップが必要な場合は、スキップ リストのようなものを調べるか、独自のハッシュ関数を開発することをお勧めします。