比较器Comparable(内部比较器)和Comparator(外部比较器)
1.使用Comparable是从实体类中直接继承Comparable接口,并且重写compareTo方法。
2.使用Comparator是建立一个外部类(继承Comparator接口,重写compare方法),在排序时,调用这个外部类,不需要改变之前的实体类
上代码:
内部比较器:
package comparator;
public class Person implements Comparable { //内部比较器
private String name;
private Integer age;
private String sex;
public Person(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
@Override
public int compareTo(Object o) {
Person p = (Person) o;
int result = this.age>p.age? -1:(this.age==p.age?0:1); //降序排列
return result;
}
}
main中实现:
Person p1 = new Person("zs",12,"男");
Person p2 = new Person("ls",15,"男");
Person p3 = new Person("ww",10,"男");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
Collections.sort(list);
System.out.println(list);
结果:
外部比较器:
实体类:
package comparator;
public class Student {
private String name;
private Integer age;
private String sex;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
public Student(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
调用的外部类:
package comparator;
import java.util.Comparator;
public class OutComparable implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Student p1 = (Student) o1;
Student p2 = (Student) o2;
return p1.getAge()-p2.getAge();
} //外部比较器
}
main方法:
Student s1 = new Student("zs",15,"女");
Student s2 = new Student("zs",13,"女");
Student s3 = new Student("zs",18,"女");
List<Student> list1 = new ArrayList<>();
list1.add(s1);
list1.add(s2);
list1.add(s3);
Collections.sort(list1,new OutComparable());
System.out.println(list1);
结果:
【注】
在内部排序中,三元表达式中,返回值-1,此元素要排在之前元素的前面,返回值0,两个元素并列,返回值1,此元素要排在之前元素的后面。