これは、ツリー構造を使用する自然な状況のようです。
残念ながら、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;
}
}
ツリーが提供できるよりも高速なルックアップが必要な場合は、スキップ リストのようなものを調べるか、独自のハッシュ関数を開発することをお勧めします。