获取地图的最小值(Key,Double)

时间:2010-05-05 19:28:46

标签: java guava

是否有方法(可能使用Google Collections)获取Map(Key, Double)的最小值?

按照传统方式,我必须根据值对地图进行排序,并采用第一个/最后一个。

9 个答案:

答案 0 :(得分:43)

您可以使用标准Collections#min()

Map<String, Double> map = new HashMap<String, Double>();
map.put("1.1", 1.1);
map.put("0.1", 0.1);
map.put("2.1", 2.1);

Double min = Collections.min(map.values());
System.out.println(min); // 0.1

更新:因为您也需要密钥,因为MapCollection,我在Collections或Google Collections2 API中看不到方法不是Entry<String, Double> min = null; for (Entry<String, Double> entry : map.entrySet()) { if (min == null || min.getValue() > entry.getValue()) { min = entry; } } System.out.println(min.getKey()); // 0.1 Maps#filterEntries()也没有用,因为你只知道迭代的 end 的实际结果。

最简单的解决方案是:

min

({{1}}上的nullcheck左侧)

答案 1 :(得分:17)

您仍然可以将Collections.min与自定义Comparator一起使用,以获得价值较低的Map.Entry

Map<String, Double> map = new HashMap<String, Double>();
map.put("1.1", 1.1);
map.put("0.1", 0.1);
map.put("2.1", 2.1);
Entry<String, Double> min = Collections.min(map.entrySet(), new Comparator<Entry<String, Double>>() {
    public int compare(Entry<String, Double> entry1, Entry<String, Double> entry2) {
        return entry1.getValue().compareTo(entry2.getValue());
    }
});
System.out.printf("%s: %f", min.getKey(), min.getValue()); // 0.1: 0.100000

使用Java 8:

Entry<String, Double> min = Collections.min(map.entrySet(),
                                       Comparator.comparing(Entry::getValue));

答案 2 :(得分:5)

  

以传统方式,我必须这样做   根据值对地图进行排序,   并采取第一个/最后一个。感谢

不,你不会。您必须遍历所有值,并在每个步骤中将当前元素与目前为止看到的最小元素进行比较。那是O(n),与排序的O(n * log(n))相比 - 可能是巨大的差异。

顺便说一句,这正是Collections.min()的工作方式。

答案 3 :(得分:3)

使用Java 8流:

return map
            .entrySet()
            .stream()
            .sorted(Comparator.comparingDouble(Map.Entry::getValue))
            .findFirst()
            .map(Map.Entry::getValue);

或者

return map
            .entrySet()
            .stream()
            .min(Comparator.comparingDouble(Map.Entry::getValue))
            .map(Map.Entry::getValue);

但是如果你想多次这样做,那么一定要看看heap

答案 4 :(得分:2)

我倾向于使用Google Collections BiMap:

     String minKey = HashBiMap.create(map).inverse().get(Collections.min(map.values()));

或类似的东西(未经测试)。

答案 5 :(得分:1)

为了有效地执行它,您可能希望定义自己的数据结构,以便它实现Map接口,但也允许有效的getMin()操作。

这可以使用两个内部数据结构来完成:映射和树(或堆数据结构)。每次添加新对(K,V)时,将它们添加到地图中,也添加到树中(作为单个条目)。这允许获得(键)操作的O(1)时间,以及添加,删除和getMin操作的O(log n)时间。

答案 6 :(得分:1)

使用java 8(和静态导入)。我们可以让@ superfav的解决方案更加整洁:

Map<String, Double> myMap;
String theKeyWithHighestValue = Collections.min(myMap.entrySet(), comparingDouble(Entry::getValue)).getKey()

答案 7 :(得分:1)

在Java 8中,我们可以轻松获得:

Double minValue = map.entrySet().stream().min(Map.Entry.comparingByValue()).get().getValue();
Double maxValue = map.entrySet().stream().max(Map.Entry.comparingByValue()).get().getValue();

答案 8 :(得分:0)

Java8 One-Liner

Key key = Collections.min(map.entrySet(), Map.Entry.comparingByValue).getKey()