範囲が均一でなく、「穴」がある、より一般的な問題のいくつかの可能な解決策を考えることができます。最も単純なものは次のとおりです。
- 複数のキーを同じ値にマッピングして、すべての有効なキー値のマップにデータを入力するだけです。HashMapsを使用すると仮定すると、これは最も時間効率が良い(O(1)ルックアップ)はずですが、セットアップ時により多くの作業があり、より多くのスペースを使用します。
- NavigableMapを使用
floorEntry(key)
し、を使用してルックアップを実行します。これは時間効率が低くなりますが(O(log(N)ルックアップ)、スペース効率が高くなります。
これは、マッピングに「穴」を許可するNavigableMapsを使用したソリューションです。
private static class Range {
public int upper, value;
...
}
NavigableMap<Integer, Range> map = new TreeMap<Integer, Range>();
map.put(0, new Range(3, 0)); // 0..3 => 0
map.put(5, new Range(10, 1)); // 5..10 => 1
map.put(100, new Range(200, 2)); // 100..200 => 2
// To do a lookup for some value in 'key'
Map.Entry<Integer,Range> entry = map.floorEntry(key);
if (entry == null) {
// too small
} else if (key <= entry.getValue().upper) {
return entry.getValue().value;
} else {
// too large or in a hole
}
一方、「穴」がない場合、解決策はより簡単です。
NavigableMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(0, 0); // 0..4 => 0
map.put(5, 1); // 5..10 => 1
map.put(11, 2); // 11..200 => 2
// To do a lookup for some value in 'key'
if (key < 0 || key > 200) {
// out of range
} else {
return map.floorEntry(key).getValue();
}