Comparable Interface
किसी class को natural ordering देने के लिए Comparable लागू करें और उसका Collections.sort के साथ उपयोग करें।
Comparable Interface, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
तुलनीय इंटरफ़ेस
Comparable<T> किसी class को स्वाभाविक क्रम देता है। इसे लागू करने पर उदाहरणों को Collections.sort(), Arrays.sort() और TreeSet जैसे क्रमबद्ध संग्रहों से क्रमबद्ध किया जा सकता है।
Comparable लागू करना
compareTo(T other) को लागू करें और ऋणात्मक मान (this < other), शून्य (समान) या धनात्मक मान (this > other) लौटाएँ।
class Product implements Comparable<Product> {
private final String name;
private final double price;
Product(String name, double price) {
this.name = name; this.price = price;
}
@Override
public int compareTo(Product other) {
return Double.compare(this.price, other.price); // ascending by price
}
@Override public String toString() { return name + "($" + price + ")"; }
}
List<Product> products = new ArrayList<>(List.of(
new Product("Mouse", 29.99),
new Product("Laptop", 999.0),
new Product("Keyboard", 79.99)
));
Collections.sort(products);
System.out.println(products); // [Mouse($29.99), Keyboard($79.99), Laptop($999.0)]compareTo का अनुबंध
Comparable को सही ढंग से लागू करने के लिए एक अनुबंध पूरा करना आवश्यक है:
- प्रतिविलोम सममिति: sgn(a.compareTo(b)) == -sgn(b.compareTo(a))
- संक्रमणशीलता: यदि a > b और b > c है, तो a > c
- संगति: a.compareTo(b) == 0 से a.equals(b) का निष्कर्ष निकलना दृढ़ता से अनुशंसित है
प्रिमिटिव की सुरक्षित तुलना
compareTo में प्रिमिटिव मानों को कभी घटाएँ नहीं — पूर्णांक अतिप्रवाह गलत परिणाम दे सकता है। Integer.compare(), Double.compare() आदि का उपयोग करें।
// WRONG: integer subtraction can overflow
int compareTo(Player other) {
return this.score - other.score; // overflow if scores differ by > Integer.MAX_VALUE
}
// CORRECT: use Integer.compare
int compareTo(Player other) {
return Integer.compare(this.score, other.score);
}
// For strings: delegate to String.compareTo
int compareTo(Player other) {
return this.name.compareTo(other.name); // String handles it correctly
}TreeSet में स्वाभाविक क्रम
Comparable लागू करने वाली classes को TreeSet और TreeMap जैसे क्रमबद्ध संग्रहों में स्वतः सही स्थान मिल जाता है।
class Priority implements Comparable<Priority> {
enum Level { LOW, MEDIUM, HIGH, CRITICAL }
final Level level;
final String task;
Priority(Level level, String task) { this.level = level; this.task = task; }
@Override
public int compareTo(Priority other) {
return this.level.compareTo(other.level); // enum ordinal order
}
@Override public String toString() { return level + ": " + task; }
}
TreeSet<Priority> queue = new TreeSet<>();
queue.add(new Priority(Priority.Level.CRITICAL, "Fix prod crash"));
queue.add(new Priority(Priority.Level.LOW, "Update docs"));
queue.add(new Priority(Priority.Level.HIGH, "Deploy feature"));
queue.forEach(System.out::println);
// LOW: Update docs
// HIGH: Deploy feature
// CRITICAL: Fix prod crashबहु-फ़ील्ड Comparable
कई फ़ील्ड के आधार पर क्रमबद्ध करने के लिए तुलनाओं को शृंखला में जोड़ें: प्राथमिक, फिर प्राथमिक के समान होने पर द्वितीयक।
class Employee implements Comparable<Employee> {
final String dept, name;
final double salary;
Employee(String dept, String name, double salary) {
this.dept = dept; this.name = name; this.salary = salary;
}
@Override
public int compareTo(Employee other) {
int deptCmp = this.dept.compareTo(other.dept);
if (deptCmp != 0) return deptCmp; // primary: by dept
return this.name.compareTo(other.name); // secondary: by name
}
}Comparable और equals की संगति
दृढ़ता से अनुशंसा की जाती है (लेकिन यह आवश्यक नहीं है) कि a.compareTo(b) == 0 तभी हो जब a.equals(b) हो। इसका उल्लंघन क्रमबद्ध सेट और मैप में सूक्ष्म बग पैदा करता है।
// BigDecimal violates this: new BigDecimal("2.0").compareTo(new BigDecimal("2.00")) == 0
// but new BigDecimal("2.0").equals(new BigDecimal("2.00")) == false
// This causes TreeSet to treat them as equal (only one stored)
TreeSet<java.math.BigDecimal> set = new TreeSet<>();
set.add(new java.math.BigDecimal("2.0"));
set.add(new java.math.BigDecimal("2.00"));
System.out.println(set.size()); // 1 — compareTo-equal → same elementCollections.sort से क्रमबद्ध करना
Collections.sort() और Arrays.sort() Comparable द्वारा परिभाषित स्वाभाविक क्रम का उपयोग करते हैं।
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
Collections.sort(names); // natural alphabetical order
System.out.println(names); // [Alice, Bob, Charlie]
String[] arr = {"banana", "apple", "cherry"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [apple, banana, cherry]
// Stream sorted() uses natural order
names.stream().sorted().forEach(System.out::println);बाइनरी खोज में Comparable
Collections.binarySearch() के लिए आवश्यक है कि सूची स्वाभाविक क्रम में क्रमबद्ध हो और तत्व Comparable लागू करते हों।
List<Integer> sorted = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11));
int idx = Collections.binarySearch(sorted, 7);
System.out.println("Found 7 at index: " + idx); // 3
int missing = Collections.binarySearch(sorted, 4);
System.out.println("4 not found, insertion point: " + (-missing - 1)); // 2Comparable बनाम Comparator
मुख्य अंतर:
- तुलनीय: class का अपना स्वाभाविक क्रम परिभाषित करता है — प्रत्येक class के लिए एक
- Comparator: बाहरी क्रम परिभाषित करता है — असीमित और संयोज्य
व्यावहारिक उदाहरण: लीडरबोर्ड
स्वाभाविक रूप से score को घटते क्रम में रखने के लिए Comparable का उपयोग करने वाला लीडरबोर्ड।
class LeaderboardEntry implements Comparable<LeaderboardEntry> {
final String player;
final int score;
final long timestamp;
LeaderboardEntry(String player, int score) {
this.player = player; this.score = score;
this.timestamp = System.nanoTime();
}
@Override
public int compareTo(LeaderboardEntry other) {
int scoreCmp = Integer.compare(other.score, this.score); // descending
if (scoreCmp != 0) return scoreCmp;
return Long.compare(this.timestamp, other.timestamp); // earlier = higher
}
@Override public String toString() { return player + ": " + score; }
}
TreeSet<LeaderboardEntry> board = new TreeSet<>();
board.add(new LeaderboardEntry("Alice", 950));
board.add(new LeaderboardEntry("Bob", 1200));
board.add(new LeaderboardEntry("Carol", 950));
board.forEach(System.out::println);
// Bob: 1200 / Alice: 950 / Carol: 950त्वरित जाँच
जब वर्तमान object argument से छोटा होता है, तब compareTo() क्या लौटाता है?
पुनरावलोकन: तुलनीय इंटरफ़ेस
मुख्य बातें:
- class का स्वाभाविक क्रम परिभाषित करने के लिए Comparable<T> लागू करें
- compareTo ऋणात्मक (छोटा), शून्य (समान) या धनात्मक (बड़ा) मान लौटाता है
- Integer.compare()/Double.compare() का उपयोग करें — कभी घटाएँ नहीं (अतिप्रवाह का जोखिम)
- बहु-फ़ील्ड क्रमबद्ध करने के लिए तुलनाओं को शृंखला में जोड़ें: प्राथमिक → द्वितीयक
- स्वाभाविक क्रम का उपयोग Collections.sort, Arrays.sort, TreeSet और TreeMap करते हैं
- Comparable एक ही क्रम परिभाषित करता है; कई क्रमों के लिए Comparator का उपयोग करें
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Comparable Interface” पाठ निःशुल्क है?
हाँ—“Comparable Interface” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Comparable Interface” में मैं क्या सीखूँगा?
किसी class को natural ordering देने के लिए Comparable लागू करें और उसका Collections.sort के साथ उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“Comparable Interface” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Comparable Interface
- Comparator और Lambda Sorting
- thenComparing से Multi-Key Sorting
- Arrays और Collections की व्यावहारिक Sorting