java List集合排序方式

java List集合排序方式

1.使用直接上代码

package com.demo;

import cn.hutool.core.date.DateTime;
import lombok.AllArgsConstructor;
import lombok.Data;

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

public class DemoCollectionsSortMain {

    public static void main(String[] args) {
        //初始化collectionsList集合
        List<NodeList> collectionsList = initializeListNodeTest();
        //1.用 Collections.sort 重写compare函数进行排序
        sortNodeList(collectionsList);
        System.out.println("===============================================================");

        //初始化streamList集合
        List<NodeList> streamList = initializeListNodeTest();
        //2.使用stream流排序
        streamSortNodeList(streamList);
        System.out.println("===============================================================");

        //初始化streamMoreList集合
        List<NodeList> streamMoreList = initializeListNodeTest();
        //2.使用stream流多个属性排序
        streamSortMoreNodeList(streamMoreList);

    }

    /**
     * 1.使用 Collections.sort 重写compare函数
     * @param list
     */
    public static void sortNodeList(List<NodeList> list){
        //1.第一种排序方式
        Collections.sort(list, new Comparator<NodeList>() {
            @Override
            public int compare(NodeList o1, NodeList o2) {
                Integer o1Disp = o1.getDisp();
                Integer o2Disp = o2.getDisp();
                //如果排序字段相同,则使用 dateTime 时间排序
                if(o1Disp == o2Disp) {
                    DateTime t1 = o1.getDateTime();
                    DateTime t2 = o2.getDateTime();
                    return t2.compareTo(t1);
                } else {
                    return Integer.compare(o1Disp, o2Disp);
                }
            }
        });

        //遍历排序后的List
        list.forEach(f->{
            System.out.println(f.getDisp()+"    "+f.getDateTime());
        });
    }

    /**
     * 2.使用 stream 流排序
     * 使用 disp 排序
     * 使用流的方式排序,需要考虑到排序字段有可能为null,添加Comparator.nullsLast(Integer::compareTo)) 防止null抛出异常
     * @param list
     */
    public static void streamSortNodeList(List<NodeList> list){
        //1.使用流的方式排序,需要考虑到排序字段有可能为null,添加Comparator.nullsLast(Integer::compareTo)) 防止null抛出异常
        List<NodeList> newList = list.stream()
                .sorted(Comparator.comparing(NodeList::getDisp,Comparator.nullsLast(Integer::compareTo)))
                .collect(Collectors.toList());
        //遍历排序后的List
        newList.forEach(f->{
            System.out.println(f.getDisp()+"   |  "+f.getDateTime());
        });
    }

    /**
     * 3.使用 stream 流 多个属性字段 排序
     * 使用多个属性字段进行排序
     * 使用流的方式排序,需要考虑到排序字段有可能为null,添加Comparator.nullsLast(Integer::compareTo)) 防止null抛出异常
     * @param list
     */
    public static void streamSortMoreNodeList(List<NodeList> list){
        //1.多个属性字段使用流的方式排序,需要考虑到排序字段有可能为null,添加Comparator.nullsLast(Integer::compareTo)) 防止null抛出异常
        List<NodeList> newList = list.stream()
                .sorted(Comparator.comparing(NodeList::getDisp,Comparator.nullsLast(Integer::compareTo))
                        .thenComparing(NodeList::getDateTime,Comparator.nullsLast(Date::compareTo)))
                .collect(Collectors.toList());
        //遍历排序后的List
        newList.forEach(f->{
            System.out.println(f.getDisp()+"   |  "+f.getDateTime());
        });
    }

    /**
     * 初始化 NodeTest 列表
     * @return
     */
    public static List<NodeList> initializeListNodeTest(){
        DateTime t1 = new DateTime("2024-07-04 13:29:58");
        DateTime t2 = new DateTime("2024-07-04 13:29:23");
        DateTime t3 = new DateTime("2024-07-04 13:29:19");
        DateTime t4 = new DateTime("2024-07-04 13:29:45");
        List<NodeList> list = new ArrayList<>();
        NodeList test1 = new NodeList(0,t1);
        NodeList test2 = new NodeList(0,t2);
        NodeList test3 = new NodeList(2,t3);
        NodeList test4 = new NodeList(0,t4);
        list.add(test1);
        list.add(test2);
        list.add(test3);
        list.add(test4);
        return list;
    }

}

@Data
@AllArgsConstructor
class NodeList{
    private Integer disp; //排序字段
    private DateTime dateTime; //排序字段
}

 

posted @ 2024-07-05 16:50  晓海无涯苦揍舟  阅读(11)  评论(0编辑  收藏  举报