web-dev-qa-db-ja.com

JavaのTreeMapで最大値のキーを取得するにはどうすればよいですか?

次のように宣言されたツリーマップがあります。

TreeMap<Integer, Integer> tree = new TreeMap<Integer, Integer>();

最大値のキーを取得するにはどうすればよいですか。これを達成するためのO(1)方法はありますか。最大キーと最小キーはO(1)時間でTreeMapから取得できることを知っています。次のとおりです。

int maxKey = tree.lastEntry().getKey();
int minKey = tree.firstEntry().getKey();

手伝ってくれてありがとう。

6
Spider Man

コレクションは値でソートされないため、逆マップが使用可能な別のコレクションがない限り、ブルートフォースO(n))が唯一の方法です。

Map<Integer, Integer>map = new TreeMap<>();
int max = map.values().stream().max(Integer::compare).get();
3
Peter Lawrey

@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());
0
Spider Man

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()
   }

}
0
Mukesh Kumar

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;
    }

}

これによって複雑さが軽減されることはありませんが、マップがいつどのように入力されるかによっては、必要なときに値を準備しておくことが望ましい場合があります。

0