【问题标题】:How to get the two highest values in a HashMap<String, Integer>如何获取 HashMap<String, Integer> 中的两个最高值
【发布时间】:2014-12-17 22:00:39
【问题描述】:

我有一个由两种类型组成的 HashMap:String 作为键,它们是玩家名称和Integer 作为值,它们是分数。

我正在创建一个排名系统,为此,我需要从这个 HashMap 中获得两个最高值,所以前两个玩家put 进入它。


例如:

如果这些是我的 HashMap 的值:

  Key         Value

String1         1
String2         2
String3         3
String4         4
String5         5

我想要一种只返回 String4String5 的方法。

我认为获得entrySet 就足够了,但是Set 中没有get 方法,所以我无法获得价值0(最高)和价值1(第二高)。

我也试过

Collections.max(map);

而且它不接受 HashMap 作为参数

final String[] top = new String[1];
int topInt = 0;

map.forEach((s, i) -> {if (i > topInt) top[0] = s;});

但这也不太奏效,这对我的表现来说太慢了。


如何获得两个最高值?

【问题讨论】:

  • 你能说得更具体点吗?你是指Map&lt;Integer, String&gt; 还是Map&lt;String, Integer&gt;
  • 您是否尝试过编写任何代码,例如遍历地图?或者更好的是 Collections.max() (docs.oracle.com/javase/7/docs/api/java/util/…),两次,在您删除最大值后第二次。
  • 另外,这个应用程序的上下文是什么?性能是一个问题吗?如果是这样,每次值更改时遍历 hashmap 可能不是最好的解决方案。
  • 您是否认为您的价值是独一无二的?如果三个字符串的值最高怎么办?
  • @ElliottFrisch 我试着说得更具体一些,你能验证一下这是否能解决问题吗?

标签: java hashmap set


【解决方案1】:

试试这样的。我还没有测试过,如果我忽略了什么,请告诉我。

int highest = Integer.MIN_VALUE;
String highestString = null;
int secondHighest = Integer.MIN_VALUE;
String secondHighestString = null;
for(Map.Entry<String, Integer> pair : yourHashMap.entrySet())
{
    if(highest < pair.getValue())
    {
        secondHighest = highest;
        secondHighestString = highestString;
        highest = pair.getValue();
        highestString = pair.getKey();
    }
}

正如其他人在 cmets 中所说的那样;这可能不是最好的方法,因为您可以使用不同的键拥有多个相同值的值。如果索引是您使用arrayArrayListjava.util.Collections 类中的内容之后的目标。

【讨论】:

  • Plus 1,我希望你没有测试过这个,因为它不能编译,但你有正确的想法。
  • 我的内存 JRE 也不太可靠。这是你的pair 声明。
  • @MeetTitan 如果有 5 个值怎么办?
  • @Kerooker,假设您没有重复值,该代码可以工作。
  • @MeetTitan 嗯..那我也不知道怎么办了哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2014-03-30
  • 2020-02-20
  • 2021-06-05
相关资源
最近更新 更多