排序 (1) : map排序

本文详细介绍如何在Java中对Map集合进行排序,包括按key、value排序的方法,支持字符串和数字类型的排序,同时提供了升序和降序的实现方式。

参考 : 

    https://blog.youkuaiyun.com/ecjtuhq/article/details/83303106

    https://www.cnblogs.com/avivahe/p/5657070.html

注 : 数字类型使用String类型排序无效


import java.util.*;

/**
 * @Auther: liyue
 * @Date: 2019/2/25 11:08
 * @Description: map排序
 */
public class MapSortUtil {

    public static final String DESC = "desc";

    public static final String ASC = "asc";

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        /*map.put("5", "s1");
        map.put("3", "s3");
        map.put("1", "s5");
        map.put("2", "s4");
        map.put("6", "s6");
        map.put("4", "s2");*/

        map.put("m1", "1");
        map.put("m2", "3");
        map.put("m3", "5");
        map.put("m4", "4");
        map.put("m5", "6");
        map.put("m6", "2");

        sortByValueIgnoreCase(map, ASC).forEach((k, v) -> {
            System.err.println(k + ":" + v);
        });
    }

    /**
     * 根据key排序
     *
     * @param map
     * @param rule : asc(升序),desc(降序)
     * @return
     */
    public static Map<String, String> sortByKey(Map<String, String> map, String rule) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, String> sortMap = null;
        if (rule.equalsIgnoreCase(ASC)) {
            sortMap = new TreeMap<>((str1, str2) -> str1.compareTo(str2));
        } else {
            sortMap = new TreeMap<>((str1, str2) -> str2.compareTo(str1));
        }
        sortMap.putAll(map);
        return sortMap;
    }


    /**
     * 根据key排序(忽略大小写)
     *
     * @param rule : asc(升序),desc(降序)
     * @param map
     * @return
     */
    public static Map<String, String> sortByKeyIgnoreCase(Map<String, String> map, String rule) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, String> sortMap = null;
        if (rule.equalsIgnoreCase(ASC)) {
            sortMap = new TreeMap<>((str1, str2) -> str1.toLowerCase().compareTo(str2.toLowerCase()));
        } else {
            sortMap = new TreeMap<>((str1, str2) -> str2.toLowerCase().compareTo(str1.toLowerCase()));
        }
        sortMap.putAll(map);
        return sortMap;
    }

    /**
     * 根据value排序
     *
     * @param oriMap
     * @param rule   : asc(升序),desc(降序)
     * @return
     */
    public static Map<String, String> sortByValue(Map<String, String> oriMap, String rule) {
        if (oriMap == null || oriMap.isEmpty()) {
            return null;
        }

        Map<String, String> sortedMap = new LinkedHashMap<>();
        List<Map.Entry<String, String>> entryList = new ArrayList<>(oriMap.entrySet());
        if (rule.equalsIgnoreCase(ASC)) {
            Collections.sort(entryList, (me1, me2) -> me1.getValue().compareTo(me2.getValue()));
        } else {
            Collections.sort(entryList, (me1, me2) -> me2.getValue().compareTo(me1.getValue()));
        }

        Iterator<Map.Entry<String, String>> iterator = entryList.iterator();
        Map.Entry<String, String> tmpEntry;
        while (iterator.hasNext()) {
            tmpEntry = iterator.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
        return sortedMap;
    }

    /**
     * 根据value排序(忽略大小写)
     *
     * @param oriMap
     * @param rule   : asc(升序),desc(降序)
     * @return
     */
    public static Map<String, String> sortByValueIgnoreCase(Map<String, String> oriMap, String rule) {
        if (oriMap == null || oriMap.isEmpty()) {
            return null;
        }

        Map<String, String> sortedMap = new LinkedHashMap<>();
        List<Map.Entry<String, String>> entryList = new ArrayList<>(oriMap.entrySet());
        if (rule.equalsIgnoreCase(ASC)) {
            Collections.sort(entryList, (me1, me2) -> me1.getValue().toLowerCase().compareTo(me2.getValue().toLowerCase()));
        } else {
            Collections.sort(entryList, (me1, me2) -> me2.getValue().toLowerCase().compareTo(me1.getValue().toLowerCase()));
        }

        Iterator<Map.Entry<String, String>> iterator = entryList.iterator();
        Map.Entry<String, String> tmpEntry;
        while (iterator.hasNext()) {
            tmpEntry = iterator.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
        return sortedMap;
    }


    /**
     * 根据value排序(数字)
     *
     * @param oriMap
     * @param rule   : asc(升序),desc(降序)
     * @return
     */
    public static Map<String, Integer> sortByValueInteger(Map<String, Integer> oriMap, String rule) {
        if (oriMap == null || oriMap.isEmpty()) {
            return null;
        }

        Map<String, Integer> sortedMap = new LinkedHashMap<>();
        List<Map.Entry<String, Integer>> entryList = new ArrayList<>(oriMap.entrySet());
        if (rule.equalsIgnoreCase(ASC)) {
            Collections.sort(entryList, (me1, me2) -> me1.getValue().compareTo(me2.getValue()));
        } else {
            Collections.sort(entryList, (me1, me2) -> me2.getValue().compareTo(me1.getValue()));
        }

        Iterator<Map.Entry<String, Integer>> iterator = entryList.iterator();
        Map.Entry<String, Integer> tmpEntry;
        while (iterator.hasNext()) {
            tmpEntry = iterator.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
        return sortedMap;
    }


    /**
     * 根据key排序(数字)
     *
     * @param map
     * @param rule : asc(升序),desc(降序)
     * @return
     */
    public static Map<Integer, String> sortByKeyInteger(Map<Integer, String> map, String rule) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<Integer, String> sortMap = null;
        if (rule.equalsIgnoreCase(ASC)) {
            sortMap = new TreeMap<>((str1, str2) -> str1.compareTo(str2));
        } else {
            sortMap = new TreeMap<>((str1, str2) -> str2.compareTo(str1));
        }
        sortMap.putAll(map);
        return sortMap;
    }
}

 

END。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值