map 按键/值排序

思路:把Entry<key,value>的集合放入List中,利用其sort函数完成排序。

public static void main(String[] args) {
    Map<Integer,Integer> map = new TreeMap<>();
    map.put(2,4);
    map.put(5,3);
    map.put(1,9);
    map.put(4,2);
    sort(map);
}

private static void sort(Map<Integer,Integer> map){
   List<Map.Entry<Integer,Integer>> list = new ArrayList<>(map.entrySet());
   // 按键倒序排序,如果需要按值排序,则比较value即可
   list.sort(
      (Map.Entry<Integer,Integer> o1,Map.Entry<Integer,Integer> o2) -> 
      										o2.getKey().compareTo(o1.getKey()));
   list.forEach(System.out::println);
}

扩展:求int数组中重复次数最多的值。
思路:首先构造一个key为数组中int值,value为其重复次数的map(通过遍历int数组可以得到),然后将map按值倒序,取limit 1即可。代码如下:

public static void main(String[] args) {
    int[] ints = {2,4,5,8,1,2,2,4,2,2,4,4,5,5,8};
    // 得到 数值和数量 对应的map
    Map<Integer,Integer> map = new TreeMap<>();
    for(int i=0;i<ints.length;i++){
        int key = ints[i];
        if(map.containsKey(key)){
            int temp = map.get(key) + 1;
            map.put(key,temp);
        }else {
            map.put(key,1);
        }
    }
	
	// 将map按值倒序排序
    List<Map.Entry<Integer,Integer>> list = new ArrayList<>(map.entrySet());
    list.sort(
       (Map.Entry<Integer,Integer> o1,Map.Entry<Integer,Integer> o2) -> 
       			o2.getValue().compareTo(o1.getValue()));
    list.stream().map(Map.Entry::getKey).limit(1).forEach(System.out::println);
}

或者

private static void getTopTwo(){
    List<Integer> source = Arrays.asList(2,4,5,8,1,2,2,4,2,2,4,4,5,5,8);
    source.stream().collect(Collectors.groupingBy(x -> x,Collectors.counting()))
            .entrySet()
            .stream()
            .sorted((Map.Entry<Integer,Long> o1,Map.Entry<Integer,Long> o2) -> 
            			o2.getValue().compareTo(o1.getValue()))
            .map(Map.Entry::getKey)
            .limit(2).forEach(System.out::println);
}
展开阅读全文

没有更多推荐了,返回首页