Có thể so sánh -java.lang.Comparable: int compareTo(Object o1)
Một đối tượng có thể so sánh có khả năng so sánh chính nó với một đối tượng khác. Bản thân lớp phải triển khai giao diện java.lang.Comp so sánh được để có thể so sánh các thể hiện của nó.
- Có khả năng so sánh đối tượng hiện tại với đối tượng được cung cấp.
- Bằng cách sử dụng điều này, chúng tôi có thể triển khai
only one sort sequence
dựa trên các thuộc tính của phiên bản. VÍ DỤ:Person.id
- Một số Class được xác định trước như String, Wrapper class, Date, Calendar đã triển khai giao diện So sánh.
Bộ so sánh -java.util.Comparator: int compare(Object o1, Object o2)
Đối tượng so sánh có khả năng so sánh hai đối tượng khác nhau. Lớp không so sánh các cá thể của nó, mà là một số cá thể của lớp khác. Lớp so sánh này phải triển khai giao diện java.util.Comparator.
- Có khả năng so sánh bất kỳ hai Đối tượng Cùng Loại nào.
- Bằng cách sử dụng điều này, chúng tôi có thể triển khai
many sort sequence
và đặt tên cho mỗi cái, dựa trên các thuộc tính của phiên bản. VÍ DỤ:Person.id, Person.name, Person.age
- Chúng tôi có thể triển khai giao diện Bộ so sánh cho các lớp được xác định trước của chúng tôi để sắp xếp Tùy chỉnh.
Thí dụ:
public class Employee implements Comparable<Employee> {
private int id;
private String name;
private int age;
private long salary;
// Many sort sequences can be created with different names.
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;
}
// setters and getters.
// Only one sort sequence can be created with in the class.
@Override
public int compareTo(Employee e) {
//return Integer.valueOf(this.id).compareTo(Integer.valueOf(e.id));
//return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
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); // call @compareTo(o1)
Collections.sort(list, Employee.nameComparator); // call @compare (o1,o2)
Collections.sort(list, Employee.idComparator); // call @compare (o1,o2)
}
}
- Đối với phân loại tùy chỉnh, chúng tôi sử dụng trình so sánh @compare (o1, o2) đối với các trường hợp khác, chúng tôi sử dụng @compareTo có thể so sánh (o1), không cần thay đổi mã nếu chúng tôi muốn sắp xếp nhiều trường thì chúng tôi sử dụng trình so sánh.
Đối với Java 8 Lambda: Tham khảo bộ so sánh trong bài đăng của tôi.