Java:获取HashMap中2个最高值的索引

Java:获取HashMap中2个最高值的索引,java,hashmap,Java,Hashmap,以下代码返回前2个最大值的相同索引: HashMap<Integer, Integer> S_List = new HashMap<Integer, Integer>(); S_List.put(3, 18); S_List.put(9, 20); S_List.put(11,20); S_List.put(13,20); S_List.put(15,20); S_List.put(17,20); S_List.p

以下代码返回前2个最大值的相同索引:

HashMap<Integer, Integer> S_List = new HashMap<Integer, Integer>();

    S_List.put(3, 18);
    S_List.put(9, 20);
    S_List.put(11,20);
    S_List.put(13,20);
    S_List.put(15,20);
    S_List.put(17,20);
    S_List.put(19,20);

    Map.Entry<Integer, Integer> maxEntry5 = null;
    Map.Entry<Integer, Integer> maxEntry6 = null;

    for (Map.Entry<Integer, Integer> entry : S_List.entrySet())
    {
        if (maxEntry5 == null || entry.getValue() > maxEntry5.getValue())
        {
            maxEntry5 = entry;
        }
        if (maxEntry6 == null || entry.getValue() > maxEntry6.getValue()
                  && entry.getKey() != maxEntry5.getKey()) {
            maxEntry6 = entry;
        } 
    }
Entry5和Entry6的输出都是17=20,而它应该是不同的索引


另一个附带问题是,当所有值都为20时,如何为前2个值获取2个随机索引。

对象应使用equals进行比较

 if (maxEntry6 == null || entry.getValue() > maxEntry6.getValue()
              && ! entry.getKey().equals( maxEntry5.getKey())) {
        maxEntry6 = entry;
 }
但主要问题在于逻辑:

if (maxEntry6 == null || 
       entry.getValue() >= maxEntry6.getValue()
    && ! entry.getKey().equals( maxEntry5.getKey())) {
        maxEntry6 = entry;
    } 
即使这些值相等,也需要另一个键的值

一个更简单的解决方案是单一的,如果:

   if (maxEntry5 == null ||
       entry.getValue() >= maxEntry5.getValue()) {
        maxEntry6 = maxEntry5;
        maxEntry5 = entry;
   }

请记住,&&优先于| |,因此entry.getValue>maxEntry6.getValue&&entry.getKey!=将一起计算maxEntry5.getKey,然后使用maxEntry6==null对结果进行OR运算。