【问题标题】:Get the key for the maximum value in a HashMap using Collections [duplicate]使用 Collections 获取 HashMap 中最大值的键
【发布时间】:2016-06-26 14:48:22
【问题描述】:

我有一个任意对象的 HashMap,其值为 Double 值:HashMap<MyObject, Double> myMap = new HashMap<>();。我可以使用Collections.max(myMap.values());HashMap 中获得最大的Double 值,但我需要获取该值的相应键。有没有一种简单的方法可以使用Collections API 做到这一点,还是我需要一个迭代器?我考虑过获取最大值的位置,然后在 HashMap 中查询该位置并获取密钥,但我不知道该怎么做。

编辑:如有必要,我可以将类型从 HashMap 更改为其他类型,但这两种类型(Object 和 Double)需要保持不变。

【问题讨论】:

  • 你需要一个迭代器。见stackoverflow.com/questions/5911174/…
  • 对不起,我删除了额外的评论嘿嘿:)
  • 为什么可以从HashMap改成别的东西?为什么它目前是 HashMap?你真的会通过 MyObject 进行密钥查找吗?

标签: java collections


【解决方案1】:

只需迭代条目集以寻找最大值:

Map.Entry<MyObject, Double> maxEntry = null;
for (Map.Entry<MyObject, Double> entry : map.entrySet()) {
  if (maxEntry == null || entry.getValue() > maxEntry.getValue()) {
    maxEntry = entry;
  }
}
MyObject maxKey = maxEntry.getKey();  // Might NPE if map is empty.

或者,如果您想获取所有具有最大值的键:

double maxValue = null;
List<MyObject> maxKeys = new ArrayList<>();
for (Map.Entry<MyObject, Double> entry : map.entrySet()) {
  if (maxValue == null || maxValue.equals(entry.getValue())) {
    maxValue = entry.getValue();
    maxKeys.add(entry.getKey());
  } else if (entry.getValue() > maxValue) {
    maxValue = entry.getValue();
    maxKeys.clear();
    maxKeys.add(entry.getKey());
  }
}

【讨论】:

  • 这似乎是最好的方法。但请注意,可能有多个“最大值”。取决于应用程序是否可能或重要。
  • 谢谢,这很好用!我考虑过使用迭代器,但想先检查是否可以使用集合。如果允许,我会在 5 分钟内接受你的回答:)
【解决方案2】:

这里有两件事。

1) 没有办法通过赋予集合框架的值来获取您的密钥。你需要一个迭代器。

2) 同样,键是唯一的,而不是值。您必须处理重复值的情况。

【讨论】:

  • 嘿,谢谢你解释为什么我不能用集合框架来做这件事——这很有意义。我接受了安迪的回答,因为他已经准备好了代码。
  • @TomOakley 这就是我的意思。您/回答者需要编写代码。集合框架没有现成的代码来使用它。
猜你喜欢
  • 2016-03-09
  • 2019-01-01
  • 2020-10-12
  • 2016-03-17
  • 2011-12-28
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多