Đây là hướng dẫn về cách sắp xếp các đối tượng:
Mặc dù tôi sẽ đưa ra một số ví dụ, nhưng dù sao thì tôi cũng khuyên bạn nên đọc nó.
Có nhiều cách khác nhau để sắp xếp một ArrayList
. Nếu bạn muốn xác định một tự nhiên (mặc định) đặt hàng , sau đó bạn cần phải cho Contact
thực hiện Comparable
. Giả sử rằng bạn muốn sắp xếp theo mặc định name
, sau đó thực hiện (bỏ qua nullcheck để đơn giản hơn):
public class Contact implements Comparable<Contact> {
private String name;
private String phone;
private Address address;
public int compareTo(Contact other) {
return name.compareTo(other.name);
}
// Add/generate getters/setters and other boilerplate.
}
để bạn có thể làm
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
Collections.sort(contacts);
Nếu bạn muốn xác định một thứ tự có thể kiểm soát bên ngoài (sẽ ghi đè thứ tự tự nhiên), thì bạn cần tạo Comparator
:
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Now sort by address instead of name (default).
Collections.sort(contacts, new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.getAddress().compareTo(other.getAddress());
}
});
Bạn thậm chí có thể xác định các Comparator
s trong Contact
chính nó để bạn có thể sử dụng lại chúng thay vì tạo lại chúng mọi lúc:
public class Contact {
private String name;
private String phone;
private Address address;
// ...
public static Comparator<Contact> COMPARE_BY_PHONE = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.phone.compareTo(other.phone);
}
};
public static Comparator<Contact> COMPARE_BY_ADDRESS = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.address.compareTo(other.address);
}
};
}
có thể được sử dụng như sau:
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Sort by address.
Collections.sort(contacts, Contact.COMPARE_BY_ADDRESS);
// Sort later by phone.
Collections.sort(contacts, Contact.COMPARE_BY_PHONE);
Và để đánh dấu phần đầu, bạn có thể cân nhắc sử dụng bộ so sánh javabean chung :
public class BeanComparator implements Comparator<Object> {
private String getter;
public BeanComparator(String field) {
this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);
}
public int compare(Object o1, Object o2) {
try {
if (o1 != null && o2 != null) {
o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);
o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);
}
} catch (Exception e) {
// If this exception occurs, then it is usually a fault of the developer.
throw new RuntimeException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);
}
return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable<Object>) o1).compareTo(o2));
}
}
mà bạn có thể sử dụng như sau:
// Sort on "phone" field of the Contact bean.
Collections.sort(contacts, new BeanComparator("phone"));
(như bạn thấy trong mã, các trường rỗng có thể đã được che để tránh NPE trong khi sắp xếp)