一.comparable接口
何为comparable接口?我们可以查阅jdk来了解到此接口可用于进行排序
那么我们该如何使用呢?
第一步:
我们要实现comparable接口!具体的代码实现以下:
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
注意 这里用了接口,所以我们必须重写一个方法!
根据ctrl加鼠标左键查阅comparable我们可知
因此:
import java.util.Arrays;
import java.util.Comparator;
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
if(this.age-o.age>0){
return 1;
}else if(this.age-o.age<0){
return -1;
}else{
return 0;
}
}
}
public class Testdemo {
public static void main(String[] args) {
Student[] student = new Student[3];
student[0] = new Student("张三",18);
student[1] = new Student("王三",10);
student[2] = new Student("李三",19);
Arrays.sort(student);
System.out.println(Arrays.toString(student));
}
}
这是一个简单的comparable接口的使用
但在main方法内 我们要只是单纯的比较大小 而不是排序,我们可以这样做:
import java.util.Arrays;
import java.util.Comparator;
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) { //这里是 age
if(this.age-o.age>0){
return 1;
}else if(this.age-o.age<0){
return -1;
}else{
return 0;
}
}
}
public class Testdemo {
public static void main(String[] args) {
Student student1 = new Student("lisi",18);
Student student2 = new Student("zhangsan",19);
if(student1.compareTo(student2)>0){
System.out.println("student1 > student2");
} else if (student1.compareTo(student2)<0) {
System.out.println("student1<student2");
}else{
System.out.println("相等");
}
}
但是 这个接口 对类侵入性太强了!
如果我们的需求更换了:比如比较姓名,那我们的代码就需要改写!
二.comparator
comparator就是应付以上问题的!
class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
//return 0;
return o1.age - o2.age;
}
}
class NameComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
//return 0;
return o1.name.compareTo(o2.name);
}
}
public class Testdemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("zhangsan",18);
students[1] = new Student("lisan",20);
students[2] = new Student("wangzhangsan",10);
//实例化比较器
AgeComparator ageComparator = new AgeComparator();
NameComparator nameComparator = new NameComparator();
//填土比较器
Arrays.sort(students,ageComparator);
System.out.println(Arrays.toString(students));
}
这里 我们 就 学完了 Comparable 接口 和 Comparator 接口 , 下面我们就来找一下 两者 的 区别 .
Comparable 和 Comparator 都是用来实现元素排序的,它们二者的区别如下
Comparable 是“比较”的意思,而 Comparator 是“比较器”的意思;
Comparable 是通过重写 compareTo 方法实现排序的,而 Comparator 是通过重写 compare 方法实现排序的;
Comparable 必须由自定义类内部实现排序方法,而 Comparator 是外部定义并实现排序的。
所以用一句话总结二者的区别:Comparable可以看作是“对内”进行排序接口,而Comparator` 是“对外”进行排序的接口。简单来说: Comparable 对类 的 侵入性高, 一旦写好比较规则,就不能轻易改变 。
而 Cinoarator 对类的 侵入性低
接下来我们可以试着写一个模拟qosrt!
import java.util.Arrays;
import java.util.Comparator;
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) { //这里是 age
if(this.age-o.age>0){
return 1;
}else if(this.age-o.age<0){
return -1;
}else{
return 0;
}
}
}
public class Testdemo {
public static void bbulesort(Comparator[] array){
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
Comparator tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("zhangsan",18);
students[1] = new Student("lisan",20);
students[2] = new Student("wangzhangsan",10);
bbulesort(students);
System.out.println(Arrays.toString(students));
}
public static void main2(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("zhangsan",18);
students[1] = new Student("lisan",20);
students[2] = new Student("wangzhangsan",10);
AgeComparator ageComparator = new AgeComparator();
NameComparator nameComparator = new NameComparator();
Arrays.sort(students,ageComparator);
System.out.println(Arrays.toString(students));
}