如何在hashmap中获得两个最大值

时间:2014-02-26 08:08:55

标签: java collections hashmap

如何在hashmap中获得2个最大值?例如。我有集合{dare = 10,to = 20,be = 15,different = 10},如果我们手动计算第一个最大值是20键,而第二个最大值是15,键是,到Finding Key associated with max Value in a Java Map我使用:

 Map.Entry<String, Float> max1 = null;
 Map.Entry<String, Float> max2 = null;

      //searching the first biggest value
      for(Map.Entry<String, Float> en : TFIDF.entrySet()){
          if (max1 == null || en.getValue().compareTo(max1.getValue()) > 0){
              max1 = en;
              }                   
      }
      //searching the second biggest value
      for(Map.Entry<String, Float> en : TFIDF.entrySet()){
          if (max2 == null || en.getValue().compareTo(max2.getValue()) <= max1.getValue()){
              max2 = en;
              }                   
      }

但在与max1比较后,该值返回最小值。

3 个答案:

答案 0 :(得分:1)

首先,你必须初始化max1max2因为每次都会跳过它,然后在第二个循环中你比较{{1}的结果使用实际值,但compareTo返回-1,0或1,因此每次都很可能更小。

编辑为了提高代码的可读性,我建议您对条目集进行排序,然后按compareTo对条目的Comparator部分进行排序然后获取第一和第二项。

答案 1 :(得分:1)

作为此代码

 en.getValue().compareTo(max2.getValue()) <= max1.getValue())
当max2小于max1的值

时,

将始终为true

我认为你想要的是

if (max2 == null || en.getValue().compareTo(max2.getValue()) > 0 
              && en.getValue().compareTo(max1.getValue() < 0)) {
         max2 = en;
}  

以上将返回第二个最高值。

答案 2 :(得分:0)

这项检查......

if (max2 == null || en.getValue().compareTo(max2.getValue()) <= max1.getValue()){

应该更像是......

if (en != max1 && (max2 == null || (en.getValue().compareTo(max2.getValue()) >0)) {