comparable接口和comparator接口的区别
程序员文章站
2022-04-17 11:20:25
...
list集合在实现排序功能时,需要实现comparable接口,如果list中的对象没有数值字段,那么就不需要实现该接口,因为string类本来就已经实现了comparable接口,因此String类型的值,本身就具有可比性,可以直接比较大小。然而数值类没有实现comparable接口,因此数值类需要比较大小,需要实现comparable接口:
实体类实现comparable接口,重写父类的comparaTo方法,这样数值类型就实现了排序功能,因此就可以使用Collections.sort(list)就可以实现数值上的排序。
例如:
public class Student implements Comparable<Student>(){
private String name;
private Integer age;
省略get和set方法
@override
public int comparaTo(Student s){
return this.getAge().comparaTo(s.getAge());
}
}
这样的话,Student对象就实现了数值排序,在外部就可以直接调用Collections.sort(list)直接对age进行排序。
如果在实体类外面实现list的排序,那么外部类就需要事先Comparator接口,实现compara方法,自定义排序规则,然后使用Collections.sort(list, comparator)实现list集合的排序,其中comparator就是排序规则,
例如:
public class ComparatorStudent implements Comparator<Student>(){
public static void main(){
Student s = new Student();
list.add(s);
...
Comparator comparator = new ComparatorStudent();
Collections.sort(list, comparator);
...
}
@override
public int compara(Student s1, Student s2){
return s1.getAge().comparaTo(s2.getAge());
}
}
实体类实现comparable接口,重写父类的comparaTo方法,这样数值类型就实现了排序功能,因此就可以使用Collections.sort(list)就可以实现数值上的排序。
例如:
public class Student implements Comparable<Student>(){
private String name;
private Integer age;
省略get和set方法
@override
public int comparaTo(Student s){
return this.getAge().comparaTo(s.getAge());
}
}
这样的话,Student对象就实现了数值排序,在外部就可以直接调用Collections.sort(list)直接对age进行排序。
如果在实体类外面实现list的排序,那么外部类就需要事先Comparator接口,实现compara方法,自定义排序规则,然后使用Collections.sort(list, comparator)实现list集合的排序,其中comparator就是排序规则,
例如:
public class ComparatorStudent implements Comparator<Student>(){
public static void main(){
Student s = new Student();
list.add(s);
...
Comparator comparator = new ComparatorStudent();
Collections.sort(list, comparator);
...
}
@override
public int compara(Student s1, Student s2){
return s1.getAge().comparaTo(s2.getAge());
}
}