Student类实现了Comparable接口,重写compareTo方法;
Student1类通过Comparator比较器实现排序;具体分析见下面代码及运行结果。
package com.company.base;
public class Student implements Comparable<Student>{
private String name;
private int age;
private float score;
public Student(String name,int age,float score){
this.name = name;
this.age = age;
this.score = score;
}
/** 实现了Comparable接口的类要重写compareTo(T o)方法
* 排序由-1,0,1及 被比较的两个参数的顺序有关系
* -1 的话,交换位置
* 0 1 不变
*/
@Override
public int compareTo(Student o) {
System.out.println(this.name+" Comparable "+o.name);
//A B比较的话 this指的是B,o指的是A,B的score>A的score的话,返回-1交换位置,也就是说降序
if (this.score > o.score){
return -1;
}else if (this.score < o.score){
return 1;
}else {
//如果A B分数相等,那么如果B的age > A的age的话,0/1的话不交换位置,那么就是说升序
if (this.age > o.age){
return 1;
}else if (this.age < o.age){
return -1;
}else {
return 0;
}
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
//省略get 和set方法
...
}
package com.company.base;
public class Student1 {
private String name;
private int age;
private float score;
public Student1(String name,int age,float score){
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
//省略get 和set方法
...
}
package com.company.base;
import java.util.*;
public class ComparableAndComparatorLearning {
public static void main(String[] args) {
Student student = new Student("A",19,99);
Student student1 = new Student("B",20,99);
Student student2 = new Student("C",19,100);
Student student3 = new Student("D",19,98);
Student[] students = {student,student1,student2,student3};
System.out.println("======排序前=====");
for (Student s:
students) {
System.out.println(s.toString());
}
System.out.println("==========Comparable实现排序===============");
Arrays.sort(students);
for (Student s:
students) {
System.out.println(s.toString());
}
System.out.println("============Comparator实现排序=============");
Student1 student01 = new Student1("A",18,99);
Student1 student11 = new Student1("B",20,99);
Student1 student21 = new Student1("C",21,100);
Student1 student31 = new Student1("D",17,98);
Student1[] students1 = {student01,student11,student21,student31};
Arrays.sort(students1, new Comparator<Student1>() {
//A B 这样的顺序的话,o1是这里的B,o2是这里的A,o1.getAge() - o2.getAge()>0 不交换A B的位置,那么升序
@Override
public int compare(Student1 o1, Student1 o2) {
System.out.println(o1.getName()+"==Comparator=="+o2.getName());
return o1.getAge() - o2.getAge();
}
});
for (Student1 s1:
students1) {
System.out.println(s1.toString());
}
}
}
运行结果
======排序前=====
Student{name='A', age=19, score=99.0}
Student{name='B', age=20, score=99.0}
Student{name='C', age=19, score=100.0}
Student{name='D', age=19, score=98.0}
==========Comparable实现排序===============
B Comparable A
C Comparable B
C Comparable B
C Comparable A
D Comparable A
D Comparable B
Student{name='C', age=19, score=100.0}
Student{name='A', age=19, score=99.0}
Student{name='B', age=20, score=99.0}
Student{name='D', age=19, score=98.0}
============Comparator实现排序=============
B==Comparator==A
C==Comparator==B
D==Comparator==C
D==Comparator==B
D==Comparator==A
Student1{name='D', age=17, score=98.0}
Student1{name='A', age=18, score=99.0}
Student1{name='B', age=20, score=99.0}
Student1{name='C', age=21, score=100.0}