チェックしているものとキーのタイプがNumber
.
これがコードサンプルです。ソートには O(n log(n)) のコストがかかり、線形検索は O(n) であるため、このパフォーマンスは約 O(n log(n)) です。
public <K extends Number & Comparable<K>, V extends Number> K findSmallestKey(Map<K, V> values, V searchItem) {
// Grab the key set, and sort it.
List<K> keys = new ArrayList<>(values.keySet());
Collections.sort(keys);
for(K key : keys) {
if(values.get(key).doubleValue() == searchItem.doubleValue()) {
return key;
}
}
return null;
}
Guavaは を提供していますBiMap
。これは、より使いやすい実世界のケースかもしれません。ただし、上書きせずに重複した値が存在することは許可されません。
その例を次に示します。
public <K extends Number, V extends Number> K findSmallestKeyWithBimap(BiMap<K, V> values, V searchItem) {
return values.inverse().get(searchItem);
}
これははるかに簡潔であり、前のものと同じ種類のジェネリックは必要ありません (これはaとNumber
の両方ではなく、 a のみである必要があります)。また、柔軟性が大幅に低下し、その性質上、キーと値の間で 1 対 1 のマッピングが明示的に保証されます。Number
Comparable