【问题标题】:Java find multiple lowest key/value pairs in a hashmap [duplicate]Java在哈希图中找到多个最低的键/值对[重复]
【发布时间】:2016-09-14 06:59:30
【问题描述】:

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

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

假设我的 HashMap 看起来像这样,我想要最低的 3。

对象,4.0

对象,5.0

对象,2.0

对象,12.0

对象,10.0

对象,3.0

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

我知道可以在 HashMap 上运行诸如 Collections.min 之类的方法,但我需要的不仅仅是最低值,我还需要知道它对应的键。研究也让我遇到了选择算法,但我很困惑,不太确定如何使用这些算法。如果以前有人问过此类问题,我深表歉意,我搜索了很长时间,但找不到任何东西。先发制人地感谢您的帮助。

【问题讨论】:

  • 快速选择需要一个数组,而不是哈希映射

标签: java sorting hashmap quicksort


【解决方案1】:

然后将地图的所有条目放入一个数组中。然后,实现一个Comparator<Map.Entry<Key,Value>>,它根据它们所持有的值比较映射条目。

最后,根据闪亮的比较器对地图的条目进行排序。 (可以使用Arrays.sort

【讨论】:

    【解决方案2】:

    考虑反转您的地图并使用“MultiMap”(实际上是对用户更友好的Map<Key, List<Value>> 实现),Guava TreeMultiMap 应该完全符合您的要求。

    http://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/TreeMultimap.html

    编辑 - 添加示例(为简洁起见,使用字符串代替自定义对象)

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

    【讨论】:

    • 介意发布一个例子吗?
    • 恐怕我手头没有例子,但文档非常好 - github.com/google/guava/wiki/…
    • 不过我更喜欢你的回答,很好地使用流 api
    • 我对 Guava 的系列非常熟悉,但我不明白他们对这个问题有何帮助。
    • OP 想要按值排序,而不是键。
    【解决方案3】:
    List<Entry<Key, Double>> lowestThreeEntries = map.entrySet()
            .stream()
            .sorted(Comparator.comparing(Entry::getValue))
            .limit(3)
            .collect(Collectors.toList());
    

    【讨论】:

    • 您好,我尝试了您的解决方案,它可能会奏效,但它需要 Java SE 8,而我目前正在使用 7。不过感谢您的帮助!
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2012-10-11
    • 2013-12-24
    • 2014-11-01
    • 2011-08-27
    相关资源
    最近更新 更多