Java中对象比较只能是地址值的比较 ==,!=, 通常我们对对象的比较其实是对对象的其中一个属性进行比较就需要使用两个接口
Comparable 自然排序
类默认的排序规则
Comparator 定制排序
默认的排序规则不满足自己的需求临时制定的排序规则
Comparable自然排序
类默认的排序规则
-
像String、包装类等,他们都实现类Comparable接口,进而实现类compareTo()方法,给出了比较两个对象大小的方式
-
重写compareTo(obj)方法的规则
- 当前对象this > 形参对象,返回正整数
- 当前对象this < 形参对象,返回负整数
- 当前对象this = 形参对象,返回0
-
如果需要对自定义类进行排序,可以让自定义类实现Comparable接口,重写CompareTo()方法在compareTo()方法中指明如何排序
-
像String或包装类等,重写CompareTo()之后,进行了从小到大的顺序排列的规则
自定义类按照成绩由小到大排序
@Test
public void test2() {
Student[] stu = new Student[5];
stu[0] = new Student("小明",77);
stu[1] = new Student("小红",94);
stu[2] = new Student("小刚",65);
stu[3] = new Student("小强",87);
stu[4] = new Student("小丽",98);
Arrays.sort(stu);
System.out.println(Arrays.toString(stu));
}
/**
自定义学生类,实现Comparable接口
已省略get/set方法
*/
public class Student implements Comparable<Student> {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
//重写的compareTo()方法,指明如何排序
@Override
public int compareTo(Student student) {
return this.score - student.score;
}
@Override
public String toString() {
return "{name=" + name +", score=" + score + '}';
}
}
Comparator 定制排序
如果需要自定义的排序规则,在不该动原有的代码,临时使用的一种排序规则,那么可以通过创建Comparator对象,将对象这个排序规则传入sort()方法
@Test
public void test3() {
//自定义的一个数组
String[] str = {"dd","mm","gg","jj","tt","vv"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//默认是从小到大,现在需求从大到小,所以返回默认排序的相反值
return -o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(str));
}