在地图java中找到最小值

时间:2016-05-20 13:51:45

标签: java data-structures

我需要在地图中找到最小值。我该怎么办?我不能使用任何数据结构,我必须在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);
    }

2 个答案:

答案 0 :(得分:1)

地图Map<Object,Integer> map = new HashMap<>();

的简单java8解决方案
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