java8 list 转map_Map按值排序,使用的【正确姿势】

d65d89be538f9f469dfc1703559b22bb.png

在实际业务开发中,可能会遇到Java Map按值排序的需要。

Java Map按值排序的常见思路是:

  1. 将map中的entry放到List中

  2. 对List中的entry通过比较器按值排序

  3. 将排序后的entry放到linkedhashmap中

Java 8利用Stream

import java.util.Collections;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map; import static java.util.Map.Entry.comparingByValue;import static java.util.stream.Collectors.toMap;  /**  * Java 8利用Stream  *  *  @author Created by yantao on 2020/7/28.  */public class SortTest {     public static void main(String[] args) throws Exception {         // 创建一个字符串为Key,数字为值的map        Map<String, Integer> budget = new HashMap<>();        budget.put("clothes", 120);        budget.put("grocery", 150);        budget.put("transportation", 100);        budget.put("utility", 130);        budget.put("rent", 1150);        budget.put("miscellneous", 90);        System.out.println("排序前: " + budget);         // 按值排序 升序        Map<String, Integer> sorted = budget                .entrySet()                .stream()                .sorted(comparingByValue())                .collect(                        toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,                                LinkedHashMap::new));         System.out.println("升序按值排序后的map: " + sorted);         // 按值排序降序        sorted = budget                .entrySet()                .stream()                .sorted(Collections.reverseOrder(comparingByValue()))                .collect(                        toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,                                LinkedHashMap::new));         System.out.println("降序按值排序后的map: " + sorted);    }  }

可以封装成工具类

/** * Map排序工具类 * *  @author Created by yantao on 2020/7/28. */public class MapSortUtil {        private static Comparator<Map.Entry> comparatorByKeyAsc = (Map.Entry o1, Map.Entry o2) -> {        if (o1.getKey() instanceof Comparable) {            return ((Comparable) o1.getKey()).compareTo(o2.getKey());        }        throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");    };      private static Comparator<Map.Entry> comparatorByKeyDesc = (Map.Entry o1, Map.Entry o2) -> {        if (o1.getKey() instanceof Comparable) {            return ((Comparable) o2.getKey()).compareTo(o1.getKey());        }        throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");    };      private static Comparator<Map.Entry> comparatorByValueAsc = (Map.Entry o1, Map.Entry o2) -> {        if (o1.getValue() instanceof Comparable) {            return ((Comparable) o1.getValue()).compareTo(o2.getValue());        }        throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");    };      private static Comparator<Map.Entry> comparatorByValueDesc = (Map.Entry o1, Map.Entry o2) -> {        if (o1.getValue() instanceof Comparable) {            return ((Comparable) o2.getValue()).compareTo(o1.getValue());        }        throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");    };     /**     * 按键升序排列     */    public static Map sortByKeyAsc(Map originMap) {        if (originMap == null) {            return null;        }        return sort(originMap, comparatorByKeyAsc);    }     /**     * 按键降序排列     */    public static Map sortByKeyDesc(Map originMap) {        if (originMap == null) {            return null;        }        return sort(originMap, comparatorByKeyDesc);    }      /**     * 按值升序排列     */    public static Map sortByValueAsc(Map originMap) {        if (originMap == null) {            return null;        }        return sort(originMap, comparatorByValueAsc);    }     /**     * 按值降序排列     */    public static Map sortByValueDesc(Map originMap) {        if (originMap == null) {            return null;        }        return sort(originMap, comparatorByValueDesc);    }     private static Map sort(Map originMap, Comparator<Map.Entry> comparator) {        return originMap.entrySet()                .stream()                .sorted(comparator)                .collect(                        Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,                                LinkedHashMap::new));    } }

测试类

package com.chujianyun.common.map; import org.junit.jupiter.api.BeforeAll;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.TestInstance; import java.util.HashMap;import java.util.Map;  /** * Map排序工具类 * *  @author Created by yantao on 2020/7/28. */@TestInstance(TestInstance.Lifecycle.PER_CLASS)class MapSortUtilTest {    // 创建一个字符串为Key,数字为值的map    Map budget = new HashMap<>();     @BeforeAll    public void init() {        budget.put("clothes", 120);        budget.put("grocery", 150);        budget.put("transportation", 100);        budget.put("utility", 130);        budget.put("rent", 1150);        budget.put("miscellneous", 90);        System.out.println("排序前: " + budget);    }     @Test    void sortByKeyAsc() {        System.out.println("按键升序" + MapSortUtil.sortByKeyAsc(budget));    }     @Test    void sortByKeyDesc() {        System.out.println("按键降序" + MapSortUtil.sortByKeyDesc(budget));    }     @Test    void sortByValueAsc() {        System.out.println("按值升序" + MapSortUtil.sortByValueAsc(budget));    }     @Test    void sortByValueDesc() {        System.out.println("按值降序" + MapSortUtil.sortByValueDesc(budget));    }}

Java 7版本

 import java.util.*; import java.lang.*;   /** *  Java 7版本排序 * *  @author Created by yantao on 2020/7/28. */public class GFG {    //  hashmap按值排序  public static HashMap<String, Integer> sortByValue(HashMap<String, Integer> hm)   {     // HashMap的entry放到List中    List<Map.Entry<String, Integer> > list =       new LinkedList<Map.Entry<String, Integer> >(hm.entrySet());      //  对List按entry的value排序    Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() {       public int compare(Map.Entry<String, Integer> o1,               Map.Entry<String, Integer> o2)       {         return (o1.getValue()).compareTo(o2.getValue());       }     });         // 将排序后的元素放到LinkedHashMap中    HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>();     for (Map.Entry<String, Integer> aa : list) {       temp.put(aa.getKey(), aa.getValue());     }     return temp;   }      public static void main(String[] args)   {      HashMap<String, Integer> hm = new HashMap<String, Integer>();      // 填充测试数据    hm.put("Math", 98);     hm.put("Data Structure", 85);     hm.put("Database", 91);     hm.put("Java", 95);     hm.put("Operating System", 79);     hm.put("Networking", 80);     Map<String, Integer> hm1 = sortByValue(hm);      // 打印按值排序后的数据    for (Map.Entry<String, Integer> en : hm1.entrySet()) {       System.out.println("Key = " + en.getKey() +             ", Value = " + en.getValue());     }   } }

如果你觉得本文对你有帮助,欢迎点赞、评论、关注,你的支持是我创作的最大动力。

4afebe1a2ed82d85c94741bb673e6045.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值