如何在Java中的TreeMap中检索具有最大值的键?

时间:2016-11-13 17:51:06

标签: java treemap

我有一个声明如下的树形图:

ls -ld .

如何检索具有最大值的密钥。是否有O(1)方法来实现这一目标。我知道可以在O(1)时间内从TreeMap检索最大和最小键,如下所示:

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

集合没有按值排序,所以唯一的方法是暴力O(n),除非有另一个集合说反向地图可用。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用TreeMap无法实现O(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()
   }

}

答案 3 :(得分:0)

您是否依赖使用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;
    }

}

这不会降低复杂性,但是取决于何时以及如何填充地图,最好在需要时为您准备好值。