关于Comparable和Comparator的应用
在学习集合时常常会使用一个Collections.sort()方法,如果集合中存放的是一些Object之类的对象,那么使用Collections还有作用吗?
java为此给我们提供了两个接口,分别是Comparable和Comparator接口来实现排序
Comparable接口
1.处于java.long包下 2.内部排序,在自定义的对象的类中实现 3.重写CompareTo方法进行比较 比如 自定义类
package Comparable;
public class Student implements Comparable<Student>{
private int age;
private int grade;
private String name;
public Student(int age, int grade, String name) {
this.age = age;
this.grade = grade;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", grade=" + grade +
", name='" + name + ''' +
'}';
}
@Override
public int compareTo(Student o) {
if (this.age==o.age){
if (this.grade==o.grade){
return this.name.compareTo(o.name);
}
return this.grade-o.grade;
}else{
return this.age-o.age;
}
}
}
main
package Comparable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Student>list=new ArrayList<Student>();
Student student1 = new Student(12,12, "a");
Student student2 = new Student(12,12, "aa");
Student student3 = new Student(12,13, "aa");
Student student4 = new Student(12,13, "aaa");
Student student5 = new Student(13,13, "aaa");
Student student6 = new Student(12,13, "a");
Student student7 = new Student(13,13, "a");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
list.add(student6);
list.add(student7);
Collections.sort(list);
for (Student s:list){
System.out.println(s);
}
}
}
控制台显示
排序成功
Comparator接口
1.在java.util包下 2.可以在外部实现排序 3.实现compare方法来实现排序 4.可以采用匿名内部类来实现
由于Collections.sort()有两个重载方法
第一个方法的使用和Comparable相似
这里展示第二种方法
package comparator;
public class Student{
private int age;
private int grade;
private String name;
public Student(int age, int grade, String name) {
this.age = age;
this.grade = grade;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", grade=" + grade +
", name='" + name + ''' +
'}';
}
}
package comparator;
import comparator.Student;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Student>list=new ArrayList<>();
Student student1 = new Student(12,12, "a");
Student student2 = new Student(12,12, "aa");
Student student3 = new Student(12,13, "aa");
Student student4 = new Student(12,13, "aaa");
Student student5 = new Student(13,13, "aaa");
Student student6 = new Student(12,13, "a");
Student student7 = new Student(13,13, "a");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
list.add(student6);
list.add(student7);
Collections.
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getAge()==o2.getAge()){
if (o1.getGrade()==o2.getGrade()){
return o1.getName().compareTo(o2.getName());
}
return o1.getGrade()-o2.getGrade();
}else{
return o1.getAge()-o2.getAge();
}
}
});
for (Student s:list){
System.out.println(s);
}
}
}
这里使用了匿名内部类,也可以将Comparator单独写成一个比较类然后将其传给Collection.sort(List,Comparator),里面也可以,Comparator比comparable灵活