我需要在地图中找到最小值。我该怎么办?我不能使用任何数据结构,我必须在O(n)时间内完成。 这段代码不起作用..但可以作为一个起点 我不能使用java 8。
Entry<K, V> min=null;
for (Entry<K, V> entry : M.entries()) {
min=entry;
if(c.compare(min.getValue(),entry.getValue())>0){
min=entry;
}
System.out.println("MIN "+min);
}
答案 0 :(得分:1)
地图Map<Object,Integer> map = new HashMap<>();
map.values().stream().min(Integer::compare).get();
修改强> 正如@Andreas指出的那样,有使用比较器的请求,所以这是Java 8的解决方案,它找到了最小的值
public static <K, V> V min8(Map<K, V> map, Comparator<V> comp) {
return map.values().stream().min(comp).get();
}
这是Java 7的解决方案,用于查找具有最小值的条目
public static <K, V> Entry<K, V> min(Map<K, V> map, Comparator<V> comp) {
Iterator<Entry<K, V>> entries = map.entrySet().iterator();
if (!entries.hasNext()) {
return null;
}
Entry<K, V> min;
for (min = entries.next(); entries.hasNext();) {
Entry<K, V> value = entries.next();
if (comp.compare(value.getValue(), min.getValue()) < 0) {
min = value;
}
}
return min;
}
我最初的解决方案非常接近@Andreas,所以我决定改变并使用itterator进行循环。
答案 1 :(得分:0)
如果您始终在循环开始时设置min = entry
,则始终将条目与自身进行比较。删除该行,然后防止min
的初始空值,然后得到:
Entry<K, V> min = null;
for (Entry<K, V> entry : M.entries()) {
if (min == null || c.compare(min.getValue(), entry.getValue()) > 0) {
min = entry;
}
}
如果您只需要值,而不是键,则使用values()
调用迭代:
V min = null;
for (V value : M.values()) {
if (min == null || c.compare(min, value) > 0) {
min = entry;
}
}
当然,在这两种情况下,假设,Map中的值都不为空。除非NullPointerException
可以处理它们,否则空值将导致Comparator
。