java获取map中值最小的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java获取map中值最小的相关的知识,希望对你有一定的参考价值。
java获取map中值最小的
值是int类型
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MinMapDemo
public static void main(String[] args)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 8);
map.put(3, 12);
map.put(5, 53);
map.put(123, 33);
map.put(42, 11);
map.put(44, 42);
map.put(15, 3);
System.out.println(getMinKey(map));
System.out.println(getMinValue(map));
/**
* 求Map<K,V>中Key(键)的最小值
* @param map
* @return
*/
public static Object getMinKey(Map<Integer, Integer> map)
if (map == null) return null;
Set<Integer> set = map.keySet();
Object[] obj = set.toArray();
Arrays.sort(obj);
return obj[0];
/**
* 求Map<K,V>中Value(值)的最小值
* @param map
* @return
*/
public static Object getMinValue(Map<Integer, Integer> map)
if (map == null) return null;
Collection<Integer> c = map.values();
Object[] obj = c.toArray();
Arrays.sort(obj);
return obj[0];
参考技术A 自己写个方法遍历说有key -value,貌似没有现成方法可已调 参考技术B import java.util.HashMap;
import java.util.Map;
public class ddd
/**
* @param args
*/
public static void main(String[] args)
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
map.put(0,5);
map.put(1,3);
map.put(2,4);
map.put(3,2);
map.put(4,6);
int k=0;
for(int i =0;i<map.size();i++)
if(i==0)
k=map.get(i);
else
if(k>=map.get(i))
k=map.get(i);
System.out.println("map中值最小的:" + k);
参考技术C 遍历MAP,去比较。没有捷径了!
从向量中提取最小值、最大值和中值的最有效方法是啥
【中文标题】从向量中提取最小值、最大值和中值的最有效方法是啥【英文标题】:What's the most efficient way to extract min, max & median from a vector从向量中提取最小值、最大值和中值的最有效方法是什么 【发布时间】:2019-10-20 16:31:25 【问题描述】:给定vector<T> vec...
,假设 T 是数字类型之一,提取其最小值、最大值和中值的最佳方法是什么?我知道std::nth_element
和std::minmax_element
,但如果一个接一个地调用它们,它们似乎会做多余的工作。
到目前为止,我想出的最好的想法是一次接一次地调用 std::nth_element 3 次。但这仍然需要 3N 比较,对吧?有没有办法重用之前迭代中完成的部分排序?
【问题讨论】:
最有效的方法是手动循环并同时计算。 @freakish 如何通过迭代元素获得中位数?std::partial_sort()
?
std::nth_element
,然后是左半边的 std::min_element
和右半边的 std::max_element
。
@DanielLangr, en.wikipedia.org/wiki/Quickselect
【参考方案1】:
使用std::nth_element
划分产生中位数,然后在左半部分使用std::min_element
,在右半部分使用std::max_element
。
如果您需要它比这更快,请根据 std::nth_element
推出您自己的版本。
【讨论】:
【参考方案2】:另一个选项是为std::nth_element
指定一个自定义比较,它捕获最小值和最大值。它可能最终会进行更多的比较和分支,因此在某些特定硬件上这可能会更慢,可能取决于缓存了多少数据等,因此 - 一如既往 - 如果你有理由关心,则进行基准测试,但是对于非空的vector
a
,该技术看起来像这样:
int min = a[0], max = a[0];
std::nth_element(a.begin(), a.begin() + n, a.end(),
[&](int lhs, int rhs)
min = std::min(min, std::min(lhs, rhs));
max = std::max(max, std::max(lhs, rhs));
return lhs < rhs;
);
在我的 (~10yo i5-660) HTPC 上使用 GCC 7.4 和 100 万个随机 int
s 在 0 到 1000 之间,nth_element
的最小/最大比较比没有。
【讨论】:
您假设std::nth_element
将至少检查所有元素一次。这是合理的,但在技术上并不能保证。
@BiagioFesta:有趣的点;语言规范不保证,但我认为它在逻辑上不可能正常工作......?
当然,在理论计算机科学中有一些关于算法复杂性的证明。但是,C++ 标准甚至没有指定使用哪种算法来实现std::nth_element
。如果我必须编写生产代码,我会自己实现完整的算法。
@BiagioFesta:这段代码的正确性与其时间复杂度不同。我会说这是不言而喻的,nth_element
重新排列输入数据实际上是不可能的,因为它需要为每个元素调用提供的比较函子 至少 一次,但是你'正确的是,当它多次调用它时,它可能会对性能产生不利影响/无法预测实现不透明时的严重程度;但在最坏的情况下,它会使比较加倍,所以没有大的-O 变化。不过可以衡量,这会让您了解是否值得担心。
在计算 (lhs以上是关于java获取map中值最小的的主要内容,如果未能解决你的问题,请参考以下文章