次のように宣言されたツリーマップがあります。
TreeMap<Integer, Integer> tree = new TreeMap<Integer, Integer>();
最大値のキーを取得するにはどうすればよいですか。これを達成するためのO(1)方法はありますか。最大キーと最小キーはO(1)時間でTreeMapから取得できることを知っています。次のとおりです。
int maxKey = tree.lastEntry().getKey();
int minKey = tree.firstEntry().getKey();
手伝ってくれてありがとう。
コレクションは値でソートされないため、逆マップが使用可能な別のコレクションがない限り、ブルートフォースO(n))が唯一の方法です。
Map<Integer, Integer>map = new TreeMap<>();
int max = map.values().stream().max(Integer::compare).get();
@PeterLawreyによって提供された回答は、十分に公平な質問に答えます。より単純な実装を探しているなら、ここにあります:
TreeMap<Integer, Integer> tree = new TreeMap<Integer, Integer>();
// populate the tree with values
Map.Entry<Integer, Integer> maxEntry = null;
for(Map.Entry<Integer, Integer> entry : tree.entrySet()){
if(maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
maxEntry = entry;
}
System.out.println("The key with maximum value is : " + maxEntry.getKey());
TreeMapではO(1)の複雑さは不可能です。最初のマップの値をキーとして使用するもう1つのマップを作成する必要があります。または使用 BiMap
public TreeBiMap implements Map {
private Map<Integer, Integer> map;
private Map<Integer, Integer> reverseMap;
public TreeBiMap() {
map = new TreeMap<>();
reverseMap = new TreeMap<>();
}
public void put(Integer key, Integer value) {
map.put(key, value);
reverseMap.put(value, key);
}
public Integer getMaxValue() {
return reverseMap.lastEntry().getKey()
}
}
TreeMapの使用に依存していますか/自分で入力しますか?私は同様の状況に遭遇し、不足している機能によってTreeMapを拡張しました。
public class TreeMapInteger<T> extends TreeMap<Integer,T> {
private static final long serialVersionUID = -1193822925120665963L;
private int minKey = Integer.MAX_VALUE;
private int maxKey = Integer.MIN_VALUE;
@Override
public T put(Integer key, T value) {
if(key > maxKey) {
maxKey = key;
}
if(key < minKey) {
minKey = key;
}
return super.put(key, value);
}
public int getMaxKey() {
return maxKey;
}
public int getMinKey() {
return minKey;
}
}
これによって複雑さが軽減されることはありませんが、マップがいつどのように入力されるかによっては、必要なときに値を準備しておくことが望ましい場合があります。