这两个都是经典接口,
1、java.lang.Comparable接口:自然排序接口
int compareTo(Object o)抽象方法
2、java.util.Comparator接口:定制排序接口
int compare(Object o1, Object o2)
Comparable和Comparator都是用来比较对象顺序的接口,使用接口里的compareTo()方法。
首先是我们的Comparable接口。
抽象方法:
int compareTo(Object o)
返回值说明:
比较此对象(this)与指定对象(形参o)的顺序。
如果该对象this小于(<)指定对象(形参o),就返回负整数
如果该对象this大于(>)指定对象(形参o),就返回正整数
如果该对象this等于(=)指定对象(形参o),就返回0
使用方法是: 在定义的类后面实现Comparable接口。
并且重写compareto方法
实现这个接口之后就可以直接使用CompareTo()去比较对象:
package com.atguigu.classics;
public class Tools {
// public void compareTwoObject(类型1 s1, 类型2 s2){
//这个类型可以接收任意对象类型,想到用Object
public static void compareTwoObject(Object s1, Object s2){
if(((Comparable)s1).compareTo(s2)>0){
System.out.println("s1 > s2");
}else if(((Comparable)s1).compareTo(s2)<0){
System.out.println("s1 < s2");
}else{
System.out.println("s1 = s2");
}
}
public static void sort(Object[] arr){
for(int i=0; i<arr.length-1; i++){
for(int j=0; j<arr.length-1-i; j++){
if(((Comparable)arr[j]).compareTo(arr[j+1]) < 0){
// Student temp = arr[j];
Object temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// public void printArr(类型[] arr){
//这个类型可以接收任意对象类型,想到用Object
public static void printArr(Object[] arr){
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
然后在我们的测试类中就可以直接调用我们的方法:
package com.atguigu.classics;
public class TestStudent2 {
public static void main(String[] args) {
/*
需求:
(1)声明两个学生对象
(2)对两个学生做大小比较
例如:按照id比较大小
*/
Student s1 = new Student(1,"张三",89,23);
Student s2 = new Student(2,"李四",90,24);
Tools.compareTwoObject(s1,s2);
/*
(3)学生对象更多了,5个,把它们放到数组中
*/
Student[] arr = new Student[5];
arr[0] = s1;
arr[1] = s2;
arr[2] = new Student(3,"王五",74,25);
arr[3] = new Student(4,"赵四",99,20);
arr[4] = new Student(5,"刘能",76,23);
/*
(4)排序,按照编号从大到小排序
*/
Tools.sort(arr);
/*
(5)输出
*/
Tools.printArr(arr);
}
}
经典接口:
1、java.lang.Comparable接口:自然排序接口
int compareTo(Object o)抽象方法
凡是在Java中两个对象要比较大小,
那么对象的类型就实现Comparable接口。Java通过设计这个接口,把所有两个对象比较大小的问题规范化了。
2、java.util.Comparator接口:定制排序接口
int compare(Object o1, Object o2)
对象还有其他的比较要求的话,一般都是单独在写一个类,实现java.util.Comparator接口:定制排序接口。
在int compare(Object o1, Object o2)方法中编写对应比较规则即可。
通常不会在Student学生类中直接实现java.util.Comparator接口。
比喻:java.lang.Comparable接口是正室放家里是OK的,
java.util.Comparator接口是彩旗,一般独立在外面。
public class StudentScoreComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
//按照学生的成绩从高到低排序
//(1)先把o1,o2的类型处理一下,向下转型
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s2.getScore() - s1.getScore();
}
}
public class StudentAgeComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
//按照学生的年龄从小到大排序
//(1)先把o1,o2的类型处理一下,向下转型
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s1.getAge() - s2.getAge();
}
}
public static void sort(Object[] arr, Comparator c){
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
/*
调用Comparator接口的实现类的
public int compare(Object o1, Object o2) 方法
比较两个元素的大小。
c.compare(arr[j], arr[j+1]) 返回结果有3种:
正:arr[j] > arr[j+1]
负:arr[j] < arr[j+1]
0:arr[j] = arr[j+1]
*/
if(c.compare(arr[j], arr[j+1]) > 0){
// Student temp = arr[j];
Object temp = arr[j];//temp的类型跟着arr数组的类型变即可
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
之后再来比较对象的话,就是用Comparable接口是很方便的。