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