我有一个小的HashMap(少于100个条目),它包含一个唯一的对象(我的设计)作为键,Double作为值。
我需要检索n个具有最低值的对象。
所以说我的HashMap看起来像这样,我想要最低的3。
对象,4.0
对象,5.0
对象,2.0
对象,12.0
对象,10.0
对象,3.0
我想获取第一个,第三个和最后一个条目,因为它们具有最低值。
我知道有一些方法,比如Collections.min,我可以在HashMap上运行,但我需要的不仅仅是最低值,我还需要知道它对应的键。研究也让我遇到了选择算法,但我很困惑,不太确定如何使用它们。如果以前曾经问过这类问题,我很抱歉,我搜索了很长时间但找不到任何东西。先谢谢你的帮助。
答案 0 :(得分:3)
List<Entry<Key, Double>> lowestThreeEntries = map.entrySet()
.stream()
.sorted(Comparator.comparing(Entry::getValue))
.limit(3)
.collect(Collectors.toList());
答案 1 :(得分:0)
将地图的所有条目放入数组中。然后,实现Comparator<Map.Entry<Key,Value>>
,根据它们保存的值比较映射条目。
最后,根据闪亮的比较器对地图的条目进行排序。 (您可以使用Arrays.sort
)
答案 2 :(得分:0)
考虑反转你的地图并使用'MultiMap'(实际上是Map<Key, List<Value>>
的一个更加用户友好的实现),Guava TreeMultiMap应该完全按你所追求的那样。
http://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/TreeMultimap.html
编辑 - 添加了示例(为了简洁起见,使用String代替自定义对象)
TreeMultimap<Double, String> map = TreeMultimap.<Double, String>create();
map.put(4.0, "a");
map.put(5.0, "b");
map.put(2.0, "c");
map.put(12.0, "d");
map.put(10.0, "e");
map.put(3.0, "f");
Iterator<String> iterator = map.values().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
这将根据双值(c,f,a,b,e,d)按升序打印出字符串