Comparable - java.lang.Comparable: int compareTo(Object o1)
可比较对象能够将自身与另一个对象进行比较。该类本身必须实现java.lang.Comparable接口才能够比较其实例。
- 能够比较当前对象和提供的对象。
- 使用它,我们可以基于实例属性实现
仅一种排序序列
。
例如:Person.id
- 一些预定义类(如String、Wrapper类、Date、Calendar)已经实现了Comparable接口。
Comparator - java.util.Comparator: int compare(Object o1, Object o2)
比较器对象能够比较两个不同的对象。该类没有比较其实例,而是一些其他类的实例。该比较器类必须实现java.util.Comparator接口。
- 能够比较同类型的任意两个对象。
- 使用它,我们可以基于实例属性实现
多个排序序列
并给每个序列命名。
例如:Person.id,Person.name,Person.age
- 我们可以为我们的预定义类实现Comparator接口以进行自定义排序。
示例:
public class Employee implements Comparable<Employee> {
private int id;
private String name;
private int age;
private long salary;
public static Comparator<Employee> NameComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
public static Comparator<Employee> idComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return Integer.valueOf(e1.getId()).compareTo(Integer.valueOf(e2.getId()));
}
};
public Employee() { }
public Employee(int id, String name, int age, long salary){
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public int compareTo(Employee e) {
if (this.id > e.id) {
return 1;
}else if(this.id < e.id){
return -1;
}else {
return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
}
}
public static void main(String[] args) {
Employee e1 = new Employee(5, "Yash", 22, 1000);
Employee e2 = new Employee(8, "Tharun", 24, 25000);
List<Employee> list = new ArrayList<Employee>();
list.add(e1);
list.add(e2);
Collections.sort(list);
Collections.sort(list, Employee.nameComparator);
Collections.sort(list, Employee.idComparator);
}
}
- 对于自定义排序,我们使用比较器 @compare(o1, o2),对于其他情况,我们使用可比接口 @compareTo(o1)。如果要按多个字段进行排序且不更改代码,则使用比较器。
请参考我的帖子Java 8 Lambda:Comparator。
Comparable
接口是否意味着我正在定义自然顺序?这给了我我正在寻找的答案。谢谢 :) - Somjit