我有一个声明如下的树形图:
ls -ld .
如何检索具有最大值的密钥。是否有O(1)方法来实现这一目标。我知道可以在O(1)时间内从TreeMap检索最大和最小键,如下所示:
TreeMap<Integer, Integer> tree = new TreeMap<Integer, Integer>();
感谢您的帮助。
答案 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)
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;
}
}
这不会降低复杂性,但是取决于何时以及如何填充地图,最好在需要时为您准备好值。