使用Comparator.comparing根据类的属性对list进行排序

该博客讨论了如何在Java中对实体类A的属性进行排序,首先按照type属性的特定顺序(集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园)排序,然后按year属性的时间顺序排序。作者通过添加一个typeid属性并设置setter方法实现了这一需求,最终成功实现了预期的排序效果。
摘要由CSDN通过智能技术生成

有如下实体类A,包含属性name,year,type。现在想要让list输出的对象A先按照type属性的“集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园”的顺序进行排序,再在已排好序的基础上按照year属性的以时间从远到近的顺序进行排序。

import java.util.Date;

public class A {

    String name;

    Date year;

    String type;

    public Date getYear() {
        return year;
    }

    public void setYear(Date year) {
        this.year = year;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public A(String name, Date year,String type) {

        this.name = name;
        this.year = year;
        this.type = type;

    }

    public A() {

    }

    @Override
    public String toString() {
        return "A{" +
                "name='" + name + '\'' +
                ", year='" + year + '\'' +
                ", type='" + type + '\'' +
                '}'+'\n';
    }

}

import java.text.ParseException;

import java.text.SimpleDateFormat;
import java.util.*;

public class Test01 {

    public static void main(String[] args) throws ParseException {

//新建17个A对象

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");

        Date date = dateformat.parse("2016-6-19");

        A a0 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a1 = new A("59", dateformat.parse("2017-01-01"),"集群");
        A a2 = new A("95", dateformat.parse("2016-01-01"),"国家级产业园");
        A a3 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a4 = new A("25", dateformat.parse("2017-6-19"),"省级产业园");
        A a5 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a6 = new A("3", dateformat.parse("2017-6-19"),"国家级强镇");
        A a7 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a8 = new A("16", dateformat.parse("2017-6-19"),"省级强镇");
        A a9 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a10 = new A("18", dateformat.parse("2018-6-19"),"田园");
        A a11 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a12 = new A("36", dateformat.parse("2018-6-19"),"田园");
        A a13 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a14 = new A("20", dateformat.parse("2019-6-19"),"田园");
        A a15 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a16 = new A("55", dateformat.parse("2019-6-19"),"省级强镇");

//将对象放入aList集合中

        List aList = new ArrayList<>();

        aList.add(a0);aList.add(a1);aList.add(a2);
        aList.add(a3);aList.add(a4);aList.add(a5);
        aList.add(a6);aList.add(a7);aList.add(a8);
        aList.add(a9);aList.add(a10);aList.add(a11);
        aList.add(a12);aList.add(a13);aList.add(a14);
        aList.add(a15);aList.add(a16);
        aList.add(a8);

        System.out.println(aList);
        System.out.println("**************************************");
/**
 * 排序顺序
 * 集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
 *
 * */


        Comparator byyear = Comparator.comparing(A::getYear);//按照year属性升序

        Comparator bytype = Comparator.comparing(A::getType);//按照type属性升序

        Collections.sort(aList, bytype.thenComparing(byyear));//将aList按照a字段先升序再按照B字段进行升序排列

        System.out.println(aList);



    }
}

按照上述代码运行的结果如下:
在这里插入图片描述
可以发现这样直接使用Comparator.comparing的确先按照type进行排序,再按照year进行排序,但是排序的结果与我们的期望不符,它并没有按照“集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园”这样的顺序进行排序。

进一步修改代码如下:
为实体类对象A添加一个typeid属性,并设置set方法

package Problem;

/**
 * @author SnakeWoodMan
 * @create 2022-04-18 21:48
 */
import java.util.Date;

public class A {

    String name;

    Date year;

    String type;

    int typeid;
//    集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
    public void setTypeid(){
        if (this.type.equals("集群")) {
            this.typeid =  1;
        }else if (this.type.equals("国家级产业园")){
            this.typeid =  2;
        }else if (this.type.equals("省级产业园")){
            this.typeid =  3;
        }else if (this.type.equals("国家级强镇")){
            this.typeid =  4;
        }else if (this.type.equals("省级强镇")){
            this.typeid =  5;
        }else if (this.type.equals("田园")){
            this.typeid =  6;
        }

    }

    public int getTypeid(){
        return typeid;
    }

    public Date getYear() {
        return year;
    }

    public void setYear(Date year) {
        this.year = year;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public A(String name, Date year,String type) {

        this.name = name;
        this.year = year;
        this.type = type;

    }

    public A() {

    }

    @Override
    public String toString() {
        return "A{" +
                "name='" + name + '\'' +
                ", year='" + year + '\'' +
                ", type='" + type + '\'' +
                '}'+'\n';
    }

}

排序代码如下:

package Problem;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author SnakeWoodMan
 * @create 2022-04-18 21:50
 */

public class Test01 {

    public static void main(String[] args) throws ParseException {

//新建9个A对象

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");

        Date date = dateformat.parse("2016-6-19");

        A a0 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a1 = new A("59", dateformat.parse("2017-01-01"),"集群");
        A a2 = new A("95", dateformat.parse("2016-01-01"),"国家级产业园");
        A a3 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a4 = new A("25", dateformat.parse("2017-6-19"),"省级产业园");
        A a5 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a6 = new A("3", dateformat.parse("2017-6-19"),"国家级强镇");
        A a7 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a8 = new A("16", dateformat.parse("2017-6-19"),"省级强镇");
        A a9 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a10 = new A("18", dateformat.parse("2018-6-19"),"田园");
        A a11 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a12 = new A("36", dateformat.parse("2018-6-19"),"田园");
        A a13 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a14 = new A("20", dateformat.parse("2019-6-19"),"田园");
        A a15 = new A("1", dateformat.parse("2016-01-01"),"集群");
        A a16 = new A("55", dateformat.parse("2019-6-19"),"省级强镇");

//将对象放入aList集合中

        List<A> aList = new ArrayList<>();

        aList.add(a0);aList.add(a1);aList.add(a2);
        aList.add(a3);aList.add(a4);aList.add(a5);
        aList.add(a6);aList.add(a7);aList.add(a8);
        aList.add(a9);aList.add(a10);aList.add(a11);
        aList.add(a12);aList.add(a13);aList.add(a14);
        aList.add(a15);aList.add(a16);
        aList.add(a8);

        System.out.println(aList);

        System.out.println("**************************************");
/**
 * 排序顺序
 * 集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
 *
 * */

        for (A a : aList){
            a.setTypeid();
        }

        Comparator bytypeid = Comparator.comparing(A::getTypeid);//按照Typeid升序

        Comparator byyear = Comparator.comparing(A::getYear);//按照Year升序

        Comparator bytype = Comparator.comparing(A::getType);//按照Type升序

        Collections.sort(aList, bytypeid.thenComparing(byyear));//将aList按照Typeid字段先升序再按照Year字段进行升序排列

        System.out.println(aList);



    }
}

最后的排序结果如下:

在这里插入图片描述

参考资料

  1. https://blog.csdn.net/weixin_42510792/article/details/114566578
  2. https://www.cnblogs.com/kuanglongblogs/p/11230250.html
  3. https://my.oschina.net/xinxingegeya/blog/2046405
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值