List集合排序

        Java中集合排序,在Java8之前,可以通过 Collections类的sort方法进行排序;Java8之后,新增 lambda和stream ,都增加了相关的排序方法,本文将整理下常见的三种排序方法。

        分别是:

说明:排序字段出现null值 会报错。

  • List 接口中的 sort 方法             --- 【操作原数据】
  • Stream 接口中的 sorted 方法   --- 【返回新List】
  • Collections.sort 工具类方法      --- 【操作原数据】

示例代码如下:

package com.example.common;

import com.example.common.utils.ObjectUtil;
import com.example.common.utils.java.UtilMisc;
import lombok.extern.slf4j.Slf4j;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.*;
import java.util.stream.Collectors;


/**
 *
 *  Java中集合排序:
 *
 *      说明:排序字段出现null值 会报错。
 *
 *      List 接口中的 sort 方法       --- 【操作原数据】
 *      Stream 接口中的 sorted 方法   --- 【返回新List】
 *      Collections.sort 工具类方法   --- 【操作原数据】
 *
 */
@Slf4j
public class ListSortTest {

    /**
     * 初始化机构列表数据
     * @return
     */
    public List<Map<String,Object>> getInitList() {

        List<Map<String,Object>> list = new ArrayList<>();

        list.add(UtilMisc.toStringKeyMap("orgId","100006","seqNo","006","orgName","测试机构100006"));
        list.add(UtilMisc.toStringKeyMap("orgId","100005","seqNo","005","orgName","测试机构100005"));
        list.add(UtilMisc.toStringKeyMap("orgId","100001","seqNo","001","orgName","测试机构100001"));
        list.add(UtilMisc.toStringKeyMap("orgId","100002","seqNo","002","orgName","测试机构100002"));
        list.add(UtilMisc.toStringKeyMap("orgId","100004","seqNo","004","orgName","测试机构100004"));
        list.add(UtilMisc.toStringKeyMap("orgId","100003","seqNo","003","orgName","测试机构100003"));
        list.add(UtilMisc.toStringKeyMap("orgId","100021","seqNo","001","orgName","测试机构100021"));
        list.add(UtilMisc.toStringKeyMap("orgId","100020","seqNo","001","orgName","测试机构100020"));
        list.add(UtilMisc.toStringKeyMap("orgId","100015","seqNo","001","orgName","测试机构100015"));
        list.add(UtilMisc.toStringKeyMap("orgId","100014","seqNo","001","orgName","测试机构100014"));
        list.add(UtilMisc.toStringKeyMap("orgId","100013","seqNo","001","orgName","测试机构100013"));
        list.add(UtilMisc.toStringKeyMap("orgId","100012","seqNo","001","orgName","测试机构100012"));
        list.add(UtilMisc.toStringKeyMap("orgId","100011","seqNo","001","orgName","测试机构100011"));

        return list;
    }

    /**
     * List接口中sort方法排序:
     *
     *      只根据序号排序(单字段排序)
     *
     *      说明:Comparator.comparing 中的参数值 不能是null,否则报错。
     *
     * @param list
     */
    public void listSortTestBySeqNo (List<Map<String,Object>> list) {

        list.sort(Comparator.comparing(map -> (String)map.get("seqNo")));
    }

    /**
     * List接口中sort方法排序:
     *
     *      根据序号、机构号排序 (多字段排序)
     *
     *      说明:seqNo 值相同时,才会根据orgId排序
     *
     * @param list
     */
    public void listSortTestBySeqNoAndOrgId (List<Map<String,Object>> list) {


        // 序号排序
        Comparator<Map<String,Object>> comparator1 = Comparator.comparing(map -> (String)map.get("seqNo"));
        // 机构号排序
        Comparator<Map<String,Object>> comparator2 = Comparator.comparing(map -> (String)map.get("orgId"));

        // 根据双字段排序,默认是正序
        list.sort(comparator1.thenComparing(comparator2));
    }

    /**
     * Collections.sort 方法排序:
     *
     *      只根据序号排序(单字段排序)
     *
     * @param list
     */
    public void collectionsSortTestBySeqNo (List<Map<String,Object>> list) {

        // 写法1:
        Collections.sort(list,Comparator.comparing(map -> (String)map.get("seqNo")));

        // 写法2:
        Collections.sort(list, new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> map1, Map<String, Object> map2) {
                String seqNo1 = (String) map1.get("seqNo");
                String seqNo2 = (String) map2.get("seqNo");
                if (!Objects.equals(seqNo1,seqNo2)) {
                    return seqNo1.compareTo(seqNo2);
                }
                return 0;
            }
        });



    }

    /**
     * Collections.sort 方法排序:
     *
     *      说明:seqNo 值相同时,才会根据orgId排序
     *
     *      根据序号、机构号排序 (多字段排序)
     *
     * @param list
     */
    public void collectionsSortTestBySeqNoAndOrgId (List<Map<String,Object>> list) {


        // 序号排序
        Comparator<Map<String,Object>> comparator1 = Comparator.comparing(map -> (String)map.get("seqNo"));
        // 机构号排序
        Comparator<Map<String,Object>> comparator2 = Comparator.comparing(map -> (String)map.get("orgId"));

        // 根据双字段排序,默认是正序

        // 写法1:
//        Collections.sort(list,comparator1.thenComparing(comparator2));

        // 写法2:
        Collections.sort(list, new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> map1, Map<String, Object> map2) {
                String seqNo1 = (String) map1.get("seqNo");
                String seqNo2 = (String) map2.get("seqNo");
                String orgId1 = (String) map1.get("orgId");
                String orgId2 = (String) map2.get("orgId");
                if (seqNo1 != null && seqNo2 != null && !Objects.equals(seqNo1,seqNo2)) {
                    return seqNo1.compareTo(seqNo2);
                }

                if (orgId1 != null && orgId2 != null && !Objects.equals(orgId1,orgId2)) {
                    return orgId1.compareTo(orgId2);
                }

                return 0;
            }
        });
    }


    /**
     * stream.sort 方法排序:
     *
     *      只根据序号排序(单字段排序)
     *
     * @param list
     */
    public List<Map<String,Object>> streamSortTestBySeqNo (List<Map<String,Object>> list) {

        // 写法1:
        List<Map<String, Object>> collect = list.stream().sorted(new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> map1, Map<String, Object> map2) {
                String seqNo1 = (String) map1.get("seqNo");
                String seqNo2 = (String) map2.get("seqNo");
                if (!Objects.equals(seqNo1, seqNo2)) {
                    return seqNo1.compareTo(seqNo2);
                }
                return 0;
            }
        }).collect(Collectors.toList());


        return collect;
    }

    /**
     * stream.sort 方法排序:
     *
     *      根据序号、机构号排序 (多字段排序)
     *
     * @param list
     */
    public List<Map<String,Object>> streamSortTestBySeqNoAndOrgId (List<Map<String,Object>> list) {

        // 写法1:
        List<Map<String, Object>> collect = list.stream().sorted(new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> map1, Map<String, Object> map2) {
                String seqNo1 = (String) map1.get("seqNo");
                String seqNo2 = (String) map2.get("seqNo");
                String orgId1 = (String) map1.get("orgId");
                String orgId2 = (String) map2.get("orgId");
                if (seqNo1 != null && seqNo2 != null && !Objects.equals(seqNo1,seqNo2)) {
                    return seqNo1.compareTo(seqNo2);
                }

                if (orgId1 != null && orgId2 != null && !Objects.equals(orgId1,orgId2)) {
                    return orgId1.compareTo(orgId2);
                }

                return 0;
            }
        }).collect(Collectors.toList());


        return collect;
    }




    public static void main(String[] args) {
        ListSortTest sortTest = new ListSortTest();
        List<Map<String, Object>> list = sortTest.getInitList();

        List<Map<String, Object>> newList = null;

        System.out.println(" --------------------------- 排序前  -----------------------------------");
        sortTest.printlnList(list);

        // 单字段排序
//        sortTest.listSortTestBySeqNo(list);

        // 多字段排序
//        sortTest.listSortTestBySeqNoAndOrgId(list);
//        sortTest.collectionsSortTestBySeqNoAndOrgId(list);

        newList = sortTest.streamSortTestBySeqNoAndOrgId(list);

        if (newList != null) {
            System.out.println(" --------------------------- 排序后newList  -----------------------------------");
            sortTest.printlnList(newList);
        }

        System.out.println(" --------------------------- 排序后list  -----------------------------------");
        sortTest.printlnList(list);

    }


    /**
     * 打印list数据
     * @param list
     */
    public void printlnList(List<Map<String, Object>> list) {
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值