package comparable;
import java.util.Comparator;
public class Student implements Comparable<Student> {
public Integer age;
public String name;
public Student() {}
public Student(Integer age,String name) {
this.age=age;
this.name=name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return this.age+"----------------"+this.name;
}
/**
* 1 实现comparable<Student>接口
* 2 实现接口的方法
*
* **/
@Override
public int compareTo(Student o) {
//按照大学生的年龄排序年龄相等的情况下用那么排序。
// 1 按照年龄来比较student,如果年龄相等
// 2那么去返回name的比较结果。
// 3如果年龄不相等,那么返回年龄的比较值。
// 因为只有两个属性,两个属性不可能完全相等,因为集合里不能有重复的元素,所以
// 先比较年龄,年龄不行等,那么就按照年龄来排序,如果年龄相等,那么就按照年龄之外的其他属性来排序,就只有name了。
// 大概的实现步骤
//
// 1 sort方法就是根据compara()方法的返回值进行排序的,具体是怎么实现的排序我也不清楚,comparable接口就只是实现了对比然后返回一个值的作用,
// 返回值:a.comparableTo(b)==0;
//意思是a==b
//<0,意思是a<b
//>0,意思是a>b
// 真正起到排序作用的是array.sort,这个类中定义了排序规则,也可能是我们之前学的冒泡排序,也可能是我们之前学的其他排序算法,总之
// 这些算法很多复杂,这些算法根据compara()方法的返回值来确定哪些参数在前面,哪些参数在后面。
// 2 一个类实现comparable接口,然后在compara()方法里面定义排序规则,方法返回一个值,
// 3然后array.sort调用这个类的实例的时候回去调用这个方法,根据这个方法的返回值去判断两个对象那个在前面,那个在后面
//
//
//
// 接口存在的意义,
//java里面电定义了一个排序的功能(array.sort方法),这个方法一定会调用comparato()方法,所以一定要规范化一个接口,让每一个想要排序的类都实现这个接口
//只有这样才能让每一个类都有排序的方法。
//array.sort和comparable接口是配套使用的,当排序的时候,肯定会调用comparable接口的方法,根据方法的返回值来对对象进行排序。
//这就是为什么要定义一个接口了,java把排序这个功能抽象出来,然后给方便我们自己给那些没有定义排序功能的类加上这个接口,只要加上这个接口,我们在调用
//array.sort的时候就会根据返回值来对对象进行排序。
//一些笔记
// 1 int 类型的数就是按照1,2,3,4,5,6这样的顺序去排序的,
// 2 string类型就是按照 a,b,c这样的顺序去排序的
// int i=this.age.compareTo(o.age);
// int k=this.name.compareTo(o.name);
//
//
// if(i==0) {
// return k;
// }else {
// return i;
// }
int x=this.age-o.age;//年龄可以直接相互加减,方法只需要有一个返回值就可以了,才不管你用的是什么途径。
int k=this.name.compareTo(o.name);
if(x==0) {
if(k<0) {
return -1; //因为要求必须返回整数,不能直接返回k 的值,然后让array.sort进行判断,array只能对整数进行判断,万一返回值是个
// 带小数点的呢,那不就完蛋了
// 所以要对k的值进行翻译,如果是小于零的就用-1表示。
}else {
return 1;
}
}else {
if(x<0) {
return -1;
}else {
return 1;
}
}
}
}
package comparable;
/**
* 1 创建一个学生类并且实现接口
* 2 创建一个测试类
* 。创建学生对象
* 。实例化容器
* 。将学生加入到容器中
* 3排序前打印一次
* 4对容器的元素排序
* 5再次打印一次
*
* **/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Studenttest {
public static List list1;
public static void sortway() {
list1=new ArrayList<>();
Student s1=new Student(4,"yuan1");
Student s2=new Student(3,"yuan2");
Student s3=new Student(2,"yuan3");
Student s4=new Student(1,"yuan4");
list1.add(s1);
list1.add(s2);
list1.add(s3);
list1.add(s4);
System.out.println(list1);
Collections.sort(list1);
System.out.println(list1);
}
public static void main(String[] args) {
sortway();
}
}