Comparble接口-自定义类排序

Comparable简介

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对该类进行排序 collerction.sort()

comparable :是在你要排序的类中去实现comparable接口,也就是说你得在你要排序的类中先写一个方法用来声明你想让你类中的属性根据什么规则来排序。

注意:使用comparable接口里面的compareTo()进行排序规则的制定,并且compareTo()方法是comparable唯一的方法。

使用场景

1.用于对象排序,解决对象数组排序,排序规则由自己定义。把对象装入Array里通过sort()方法对其进行排序

2.假如说我们有这样一个需求,需要设计一个Student类,有两个属性:姓名(name)、年龄(age)、班级(class)、学号(StudentID),按照年龄、或者班级、或者学号、的大小进行排序,那么实现可以这样

代码:

class Person implements Comparable<Person>{
    int age;
    String name;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "姓名:"+name+","+"年龄:"+age+";";
    }

    @Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        if(this.age>o.age){
            return 1;
        }else if(this.age<o.age){
            return -1;
        }
        //当然也可以这样实现
        // return Integer.compare(this.age, o.age);
        return 0;
    }
}

测试:

public static void main(String[] args) {

Person []persons = new Person[]{
    new Person("张三",15),
    new Person("李四",25),
    new Person("王五",20)
};
Arrays.sort(persons);
System.out.println(Arrays.toString(persons));
System.out.println(persons[0]==persons[1]);
System.out.println(persons[0].equals(persons[1]));

结果:

[姓名:王五,年龄:10;, 姓名:张三,年龄:15;, 姓名:李四,年龄:15;]
false
false

注意细节

Comparable接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。

Comparable只是在Arrays里面起作用,其他地方目前我并没有发现什么作用,包括运算符和equals上,这个接口也不起什么作用。

2.Comparator接口

Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。

实际开发举例代码

包装类Model

/**
 * @ClassName YuqingMonthActive
 * @Description TODO
 * @Author wuqingxiao
 * @Date 2022/9/16 10:40
 * @Version 1.0
 */
@Getter
@Setter
public class YuqingMonthActive implements Comparable<YuqingMonthActive> {
    @JsonFormat(pattern = "yyyy-MM")
    @DateTimeFormat(pattern = "yyyy-MM")
    private String updateMonth; //活跃月份
    private String activeTime;//活跃数量

    public YuqingMonthActive(String updateMonth, String activeTime) {
        this.updateMonth = updateMonth;
        this.activeTime = activeTime;
    }

    @Override
    public int compareTo(YuqingMonthActive o) {
        //实现类排序规则
        if(Integer.parseInt(this.updateMonth.replace("-", "")) > Integer.parseInt(o.updateMonth.replace("-", ""))){
            return 1;
        }else if(Integer.parseInt(this.updateMonth.replace("-", "")) < Integer.parseInt(o.updateMonth.replace("-", ""))){
            return -1;
        }
        return 0;
    }

    public YuqingMonthActive() {
    }
}

接口调用:

   @ApiOperation("获取正式用户活跃数")
    @PostMapping({"/getYuQingFormalActiveUser"})
    @DataSource(DataSourceType.SLAVE)
    public AjaxResult getYuQingFormalActiveUser(@RequestBody YuqingModel yuqingModel) throws Exception {
        List<YuqingMonthActive> list = this.tYuqingUserinfoService.getMonthActive(yuqingModel);
             Object[] objects=list.toArray();//将集合转数组对象
             Arrays.sort(objects);//排序
            return AjaxResult.success(objects);
    }
//结果是按照年月排序。

注意细节

Comparator,其中泛型T为比较器可以比较的对象的类型,在这里面为Person

转载原文链接:https://blog.csdn.net/qq_41474648/article/details/105182845

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值