Java在hashmap中找到多个最低的键/值对

时间:2016-05-18 01:13:00

标签: java sorting hashmap quicksort

我有一个小的HashMap(少于100个条目),它包含一个唯一的对象(我的设计)作为键,Double作为值。

我需要检索n个具有最低值的对象。

所以说我的HashMap看起来像这样,我想要最低的3。

对象,4.0

对象,5.0

对象,2.0

对象,12.0

对象,10.0

对象,3.0

我想获取第一个,第三个和最后一个条目,因为它们具有最低值。

我知道有一些方法,比如Collections.min,我可以在HashMap上运行,但我需要的不仅仅是最低值,我还需要知道它对应的键。研究也让我遇到了选择算法,但我很困惑,不太确定如何使用它们。如果以前曾经问过这类问题,我很抱歉,我搜索了很长时间但找不到任何东西。先谢谢你的帮助。

3 个答案:

答案 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)按升序打印出字符串