JAVA List自定义排序 多字段排序

简单的排序一般用一个sorted就行

list = list.stream().sorted(Comparator.comparing(TestSort::getState)).collect(Collectors.toList());

再稍微多一个字段,说不定加一个.thenComparing(TestSort::getCode).reversed()也能实现需求

//reversed()倒序排列,默认都是从小到大排序,加上reversed实现倒序

list = list.stream().sorted(Comparator.comparing(TestSort::getState)
                .thenComparing(TestSort::getCode).reversed()).collect(Collectors.toList());

但有一些稍微复杂的,存在逻辑的判断,就需要自定义排序。

比如根据多个字段比较排序,根据指定的中文排序,等等。都可以用Collections.sort,重写compare方法。

可以自己先通过一个小demo理解一下compare返回值,多考虑各种情况,排序需求基本都能实现。

需求:把state为3、5的值置顶后,根据code排序。

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author ZoeySir
 */
public class TestSort {

    private int code;
    private int state;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public TestSort(int code, int state) {
        this.code = code;
        this.state = state;
    }

    public static void main(String[] args) {
        TestSort s1 = new TestSort(2, 5);
        TestSort s2 = new TestSort(4, 1);
        TestSort s3 = new TestSort(5, 2);
        TestSort s4 = new TestSort(3, 3);
        TestSort s5 = new TestSort(1, 2);
        List<TestSort> sortList = Stream.of( s1,s4, s2,s5,s3).collect(Collectors.toList());
        //自定义对象字段排序
        //需求:把state为3、5的值置顶后,根据code排序
        Collections.sort(sortList, new Comparator<TestSort>() {
            /**
             * 两个对象做比较,自定义排序
             */
            @Override
            public int compare(TestSort o1, TestSort o2) {
                //返回值解释:返回值为-1 、0、1
                //-1代表左边小于右边,即o1 < o2
                //0代表相等,即o1 = o2
                //1代表左边大于右边,即o1 > o2

                if (o1.getState() == 3 || o1.getState() == 5 ){
                    if (o1.getCode() > o2.getCode()){
                        return 1;
                    }
                    return -1;
                }
                if (o2.getState() == 3 || o2.getState() == 5){
                    return 1;
                }
                if (o1.getCode() < o2.getCode()){
                    return -1;
                }
                if (o1.getCode() > o2.getCode()){
                    return 1;
                }
                return 0;
            }
        });
        for (TestSort t : sortList) {
            System.out.println(t.getCode() + "===" + t.getState());
        }
    }
}

输出:

perfect~

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值