यहां ऑब्जेक्ट्स ऑर्डर करने के बारे में एक ट्यूटोरियल है:
हालाँकि मैं कुछ उदाहरण दूंगा, फिर भी मैं इसे पढ़ने की सलाह दूंगा।
सॉर्ट करने के लिए विभिन्न तरीके हैं ArrayList। यदि आप प्राकृतिक (डिफ़ॉल्ट) ऑर्डर को परिभाषित करना चाहते हैं , तो आपको इसे Contactलागू करने की आवश्यकता है Comparable। मान लें कि आप डिफ़ॉल्ट रूप से सॉर्ट करना चाहते हैं name, तो करें (सरलता के लिए छोड़े गए nullchecks)
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.
}
ताकि आप बस कर सकें
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
Collections.sort(contacts);
यदि आप एक बाहरी नियंत्रणीय ऑर्डर को परिभाषित करना चाहते हैं (जो प्राकृतिक ऑर्डरिंग को ओवरराइड करता है), तो आपको एक बनाने की आवश्यकता है 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());
}
});
आप स्वयं Comparatorमें s को भी परिभाषित Contactकर सकते हैं ताकि आप उन्हें हर बार पुनः बनाने के बजाय पुन: उपयोग कर सकें:
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);
}
};
}
जिसका उपयोग निम्नानुसार किया जा सकता है:
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);
और ऊपर से क्रीम लगाने के लिए, आप जेनेरिक जेवबीन तुलनित्र का उपयोग करने पर विचार कर सकते हैं :
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));
}
}
जिसका उपयोग आप निम्न प्रकार से कर सकते हैं:
// Sort on "phone" field of the Contact bean.
Collections.sort(contacts, new BeanComparator("phone"));
(जैसा कि आप कोड में देखते हैं, संभवतया अशक्त फ़ील्ड NPE के दौरान सॉर्ट से बचने के लिए पहले से ही कवर किए गए हैं)