Java list 三级排序

工作中有这么一个需求:

  • 默认卡只有一个,且排首位
  • 支持自动还款的银行卡优先排列。用户设置的支持自动还款银行卡,按照绑定时间,倒序排列;
  • 不支持自动还款的银行卡:按照绑定时间,倒序排列。

我们知道根据一个字段,或者两个字段都是比较容易实现的。Java8中也有。参考 Java8:Lambda表达式增强版Comparator和排序

可能是我不够NB,上面那个需求没能用Comparator写出来。
下面是另外一种实现,请NB的人来指点一二:

import lombok.Builder;
import lombok.Data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@Data
@Builder
public class UserBindCard {
    /**
     * 银行卡卡号后四位
     */
    private String cardNoTail;
    /**
     * 快捷签约时间
     */
    private String bindTime;
    /**
     * 银行中文名称
     */
    private String bankName;
    /**
     * 是否是默认自动还款银行卡; true:是;false:不是
     */
    public boolean defaultCard;
    /**
     * 是否支持自动还款 true:支持;false:不支持
     */
    public boolean supportAutoRePayment;


    /**
     * 需求:
     * 默认卡只有一个,且排首位
     * 支持自动还款的银行卡优先排列。用户设置的支持自动还款银行卡,按照绑定时间,倒序排列;
     * 不支持自动还款的银行卡:按照绑定时间,倒序排列。
     *
     * @param args
     */
    public static void main(String[] args){
        List<UserBindCard> list = new ArrayList<>();

        list.add(UserBindCard.builder().bankName("中国银行5").bindTime("2017-05-01").cardNoTail("2222").defaultCard(false).supportAutoRePayment(false).build());
        list.add(UserBindCard.builder().bankName("中国银行1").bindTime("2017-03-04").cardNoTail("8888").defaultCard(false).supportAutoRePayment(true).build());
        list.add(UserBindCard.builder().bankName("中国银行2").bindTime("2017-04-04").cardNoTail("1111").defaultCard(true).supportAutoRePayment(true).build());
        list.add(UserBindCard.builder().bankName("中国银行3").bindTime("2017-05-06").cardNoTail("2222").defaultCard(false).supportAutoRePayment(false).build());
        list.add(UserBindCard.builder().bankName("中国银行4").bindTime("2017-03-06").cardNoTail("3333").defaultCard(false).supportAutoRePayment(true).build());

        System.out.println(list);

        Collections.sort(list, (o1, o2) -> {
            int ret = (o2.defaultCard + "").compareTo(o1.defaultCard + "");
            if (0 != ret) return ret;

            ret = (o2.supportAutoRePayment + "").compareTo(o1.supportAutoRePayment + "");
            if (0 != ret) return ret;

            ret = o2.getBindTime().compareTo(o1.getBindTime());
            if (0 != ret) return ret;

            return ret;
        });
        System.out.println(list);
    }
}

运行结果:

[UserBindCard(cardNoTail=2222, bindTime=2017-05-01, bankName=中国银行5, defaultCard=false, supportAutoRePayment=false), UserBindCard(cardNoTail=8888, bindTime=2017-03-04, bankName=中国银行1, defaultCard=false, supportAutoRePayment=true), UserBindCard(cardNoTail=1111, bindTime=2017-04-04, bankName=中国银行2, defaultCard=true, supportAutoRePayment=true), UserBindCard(cardNoTail=2222, bindTime=2017-05-06, bankName=中国银行3, defaultCard=false, supportAutoRePayment=false), UserBindCard(cardNoTail=3333, bindTime=2017-03-06, bankName=中国银行4, defaultCard=false, supportAutoRePayment=true)]
[UserBindCard(cardNoTail=1111, bindTime=2017-04-04, bankName=中国银行2, defaultCard=true, supportAutoRePayment=true), UserBindCard(cardNoTail=3333, bindTime=2017-03-06, bankName=中国银行4, defaultCard=false, supportAutoRePayment=true), UserBindCard(cardNoTail=8888, bindTime=2017-03-04, bankName=中国银行1, defaultCard=false, supportAutoRePayment=true), UserBindCard(cardNoTail=2222, bindTime=2017-05-06, bankName=中国银行3, defaultCard=false, supportAutoRePayment=false), UserBindCard(cardNoTail=2222, bindTime=2017-05-01, bankName=中国银行5, defaultCard=false, supportAutoRePayment=false)]
发布了234 篇原创文章 · 获赞 212 · 访问量 91万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览