在java映射中查找最小值

在java映射中查找最小值,java,data-structures,Java,Data Structures,我需要在地图上找到最小值。我该怎么办?我不能使用任何数据结构,我必须在O(n)时间内完成。 此代码无效..但可以作为起点 我不能使用Java8 Entry<K, V> min=null; for (Entry<K, V> entry : M.entries()) { min=entry; if(c.compare(min.getValue(),entry.getValue())>0){ min=ent

我需要在地图上找到最小值。我该怎么办?我不能使用任何数据结构,我必须在O(n)时间内完成。 此代码无效..但可以作为起点
我不能使用Java8

 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);
    }
Entry min=null;
对于(条目:M.entries()){
最小值=输入;
如果(c.compare(min.getValue(),entry.getValue())>0){
最小值=输入;
}
系统输出打印项次(“最小”+MIN);
}

map的简单java8解决方案
map-map=newhashmap()

编辑 正如@Andreas指出的,有人要求使用comparator,所以这是Java8的解决方案,它可以找到最小的值

public static <K, V> V min8(Map<K, V> map, Comparator<V> comp) {
    return map.values().stream().min(comp).get();
}
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;
    }
publicstaticvmin8(映射图、比较器comp){
返回map.values().stream().min(comp.get();
}
这是Java7的解决方案,用于查找具有最小值的条目

public static <K, V> V min8(Map<K, V> map, Comparator<V> comp) {
    return map.values().stream().min(comp).get();
}
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;
    }
公共静态输入最小值(映射映射、比较器comp){
迭代器条目=map.entrySet().Iterator();
如果(!entries.hasNext()){
返回null;
}
输入最小值;
for(min=entries.next();entries.hasNext();){
Entry value=entries.next();
if(comp.compare(value.getValue(),min.getValue())<0){
最小值=数值;
}
}
返回最小值;
}

我的初始解决方案非常接近@Andreas,因此我决定更改并使用Iterator进行for循环。

如果您总是在循环开始时设置
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;
    }
}

当然,在这两种情况下,都假定映射中没有值为null。空值将导致
空点异常
,除非
比较器
可以处理它们。

通过此链接我不能使用java8@FilomenaDelSorbo你不认为这是问题中的一条相关信息吗?这两个选项都假设值为
整数。问题使用
比较器
(变量
c
)这一事实表明情况并非如此。另外,这个问题似乎在寻找最小的
项(key+value),而不仅仅是最小值。@Andreas的观点很好,适用于java 7,但太懒了,无法适用于java 8。我认为这与op不使用Java8无关