Comparable vs Comparator
अपने objects sort करना
Java numbers और strings खुद sort कर सकती है, पर अपने objects (जैसे Students) sort करने को उसे order पता होना चाहिए। दो tools यह करते हैं: Comparable (एक built-in natural order) और Comparator (कई custom orders)। साथ में ये sorting पर पूरा नियंत्रण देते हैं।
Comparable — natural order
class Student implements Comparable<Student> {
String name; int marks;
Student(String n, int m) { name = n; marks = m; }
public int compareTo(Student other) {
return this.marks - other.marks; // marks से sort
}
}
// इस्तेमाल:
Collections.sort(studentList); // compareTo इस्तेमाल करता है
Comparable और उसकी compareTo implement करना class को एक natural order देता है। Collections.sort फिर उससे list sort करता है। यहाँ students marks से, कम से ज़्यादा sort होते हैं।
Comparator — custom orders
import java.util.Comparator;
Comparator<Student> byName = new Comparator<>() {
public int compare(Student a, Student b) {
return a.name.compareTo(b.name); // name से sort
}
};
Collections.sort(studentList, byName);
Comparator class के बाहर एक sort order define करता है, अपनी compare method से। आप इसे sort को भेजते हैं। यह आपको एक ही objects अलग तरीक़ों से sort करने देता है।
कई sort orders
Comparator का बड़ा फ़ायदा एक ही class को कई orders होना है:
- Students को marks से sort (Comparable का natural order)।
- Name से sort (एक Comparator)।
- Marks descending से sort (एक और Comparator)।
Comparable इकलौता default देता है; Comparators जितने चाहिए उतने विकल्प देते हैं।
Lambda के साथ Comparator
// छोटा lambda रूप: studentList.sort((a, b) -> a.marks - b.marks); // helper से और साफ़: studentList.sort(Comparator.comparing(s -> s.name));
चूँकि Comparator की इकलौती method है, आप इसे छोटे lambda के रूप में लिख सकते हैं। Comparator.comparing(...) sort करने वाला field नाम देकर इसे और साफ़ बनाता है।
Comparable बनाम Comparator
| बात | Comparable | Comparator |
|---|---|---|
| Method | compareTo | compare |
| कहाँ | Class के अंदर | Class के बाहर |
| Orders | एक (natural) | कई custom |
| Sort call | Collections.sort(list) | sort(list, comparator) |
आम गलतियाँ
- गलत compareTo return। negative/zero/positive लौटाइए, true/false नहीं।
- घटाव से integer overflow। बहुत बड़े ints को
Integer.compare(a, b)बेहतर। - Comparable से कई orders की उम्मीद। यह एक देता है — ज़्यादा को Comparators इस्तेमाल कीजिए।
- Interface implement न करना। Objects sort करने को Comparable या Comparator चाहिए।
सारांश
- Custom objects sort करने को Comparable या Comparator चाहिए।
- Comparable
compareToसे एक natural order define करता है। - Comparator
compareसे custom orders define करता है, class के बाहर। - कई sort orders को Comparators इस्तेमाल कीजिए।
- Comparators छोटे lambdas के रूप में लिखे जा सकते हैं।
आगे, data sorted रखिए TreeSet से, या compact logic लिखिए lambda expressions से।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
Comparable और Comparator में क्या अंतर है?
compareTo method क्या है?
compareTo Comparable interface की इकलौती method है। यह negative number, zero, या positive number लौटाती है यह बताने को कि यह object दूसरे से छोटा, बराबर, या बड़ा है — जो sort को order बताता है।Comparable के बजाय Comparator कब इस्तेमाल करूँ?
Java में objects की list कैसे sort करूँ?
Collections.sort(list) call कीजिए। Custom order को Comparator भेजिए: Collections.sort(list, comparator) या list.sort(comparator)।क्या Comparator को lambda के रूप में लिख सकता हूँ?
(a, b) -> a.marks - b.marks, या साफ़, छोटे sorting code को Comparator.comparing(...) जैसे helpers इस्तेमाल कीजिए।