在java映射中查找最小值
我需要在地图上找到最小值。我该怎么办?我不能使用任何数据结构,我必须在O(n)时间内完成。 此代码无效..但可以作为起点在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
我不能使用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无关