请问如何根据java中按升序排列的值对地图元素进行排序?

时间:2017-02-15 14:43:38

标签: java sorting linkedhashmap

我正在尝试使用Collections.sort()对地图元素(基于值)进行排序。问题是我的程序按降序对元素进行排序,而不是按升序排序。我怎样才能按升序排序?以下是我的代码。

package hashTableRR;

import java.util.*;
import java.util.Map.Entry;
public class OrderByValue {

    public static void main(String [] args){

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    map.put(1, 4);
    map.put(2, 6);
    map.put(3, 1);
    map.put(4, 1);
    map.put(6, 8);
    map.put(7, 5);

    Set<Entry<Integer, Integer>> set = map.entrySet();
    List<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set);
    Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>()
    {
        public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2){
            return(o2.getValue()).compareTo(o1.getValue());
        }
    }

            );

    System.out.println("Keys\t\tValues");
    for(Map.Entry<Integer, Integer> entry:list)
    {
        System.out.println(" "+entry.getKey()+"\t\t  "+entry.getValue());

    }       


    }
}

4 个答案:

答案 0 :(得分:3)

只需更改compare功能

中变量的顺序即可
return(o1.getValue()).compareTo(o2.getValue());

答案 1 :(得分:1)

问题可能出在Comparator#compare实施中。

您将返回:o2.getValue().compareTo(o1.getValue())

对于升序,您应该返回:o1.getValue().compareTo(o2.getValue())

如果o1 < o20如果它们相等则会生成负值,如果o2 > o1则为正值。

请参阅稍加密切的文档here

通过以下方式深入了解了Comparator在使用Java Integer进行比较时可以期望返回的值(完整文档here):

  

如果此Integer等于参数Integer,则值为0;如果此Integer在数值上小于参数Integer,则小于0的值;如果此Integer在数值上大于参数Integer(带符号的比较),则值大于0。

答案 2 :(得分:1)

只需使用:

return(o1.getValue()).compareTo(o2.getValue());

显然会逆序

答案 3 :(得分:1)

 Map<Integer, Integer> unsortedMap = new HashMap<>();
    Map<Integer, Integer> sortedMap = new LinkedHashMap<>();
    unsortedMap.put(1, 4);
    unsortedMap.put(2, 6);
    unsortedMap.put(3, 1);
    unsortedMap.put(4, 1);
    unsortedMap.put(6, 8);
    unsortedMap.put(7, 5);


    unsortedMap.entrySet().
            stream().
            sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed()).
            forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));

    System.out.println(sortedMap);
  
    

如果您希望按照将密钥插入LinkedHashMap的顺序存储数据,请使用Map。     HashMap不保证任何订单。