अव्यवस्था को कैसे नियंत्रित करें: Java में ऑब्जेक्ट्स के ArrayList को किसी भी फील्ड से सॉर्ट करें
\n\nकल्पना करें: आप एक पुस्तक सूची ऐप बना रहे हैं। आपके पास Book नामक एक क्लास है जिसमें title, author, price और year फील्ड हैं। आप दर्जनों किताबों को ArrayList में डालते हैं। और फिर यूज़र कहता है: "पहले सबसे नई किताबें दिखाओ!", और एक मिनट बाद — "नहीं, अब कीमत के अनुसार सॉर्ट करो!"।
अगर आप कभी इस समस्या से जूझे हैं, तो आप जानते हैं कि सिर्फ Collections.sort(list) कॉल करने से काम नहीं चलेगा। Java आपके मन की बात नहीं पढ़ सकता। आपको उसे स्पष्ट रूप से बताना होगा: किस फील्ड के आधार पर सॉर्ट करना है। यही कस्टम ऑब्जेक्ट सॉर्टिंग पर Stack Overflow का सबसे लोकप्रिय सवाल है।
इस लेख में हम ArrayList को ऑब्जेक्ट प्रॉपर्टी के अनुसार सॉर्ट करने के सभी तरीकों पर चर्चा करेंगे: क्लासिक Comparable से लेकर आधुनिक लैम्ब्डा एक्सप्रेशन और Stream API तक। चलिए शुरू करते हैं!
तैयारी: वह क्लास जिसे हम सॉर्ट करेंगे
\n\nउदाहरणों के लिए एक सरल Person क्लास बनाते हैं:
public class Person {\n private String name;\n private int age;\n private double salary;\n\n public Person(String name, int age, double salary) {\n this.name = name;\n this.age = age;\n this.salary = salary;\n }\n\n // गेटर्स (सेटर्स को संक्षिप्तता के लिए छोड़ा गया है)\n public String getName() { return name; }\n public int getAge() { return age; }\n public double getSalary() { return salary; }\n\n @Override\n public String toString() {\n return name + " (" + age + " साल, $" + salary + ")";\n }\n}\n\n\nऔर अपनी लिस्ट को भरते हैं:
\n\nArrayList<Person> people = new ArrayList<>();\npeople.add(new Person("अन्ना", 28, 55000));\npeople.add(new Person("बोरिस", 35, 72000));\npeople.add(new Person("विक्टर", 22, 48000));\npeople.add(new Person("गैलिना", 30, 62000));\n\n\nअब सब कुछ प्रयोग के लिए तैयार है। इस लिस्ट को उम्र के अनुसार कैसे सॉर्ट करें? नाम से? वेतन से? Java में कम से कम तीन तरीके हैं। चलिए सबसे बुनियादी से शुरू करते हैं।
\n\nतरीका 1: Comparable — सॉर्टिंग लॉजिक को सीधे क्लास में एम्बेड करें
\n\nComparable इंटरफ़ेस ऑब्जेक्ट का "प्राकृतिक क्रम" है। यदि आप चाहते हैं कि आपके ऑब्जेक्ट हमेशा एक ही फील्ड (जैसे, उम्र) के अनुसार सॉर्ट हों, तो इस इंटरफ़ेस को लागू करें।
अपने Person क्लास को बदलते हैं:
public class Person implements Comparable<Person> {\n // ... फील्ड्स, कंस्ट्रक्टर, गेटर्स ...\n\n @Override\n public int compareTo(Person other) {\n return Integer.compare(this.age, other.age);\n }\n}\n\n\nअब सॉर्टिंग सिर्फ एक लाइन में:
\n\nCollections.sort(people);\nSystem.out.println(people);\n// आउटपुट: [विक्टर (22 साल, $48000), अन्ना (28 साल, $55000), गैलिना (30 साल, $62000), बोरिस (35 साल, $72000)]\n\n\nफायदे: सरलता, बाहरी कम्पेरेटर के बारे में सोचने की ज़रूरत नहीं।
\nनुकसान: आप क्लास में केवल एक सॉर्टिंग तरीका "सिलाई" कर रहे हैं। अगर कल नाम से सॉर्ट करने की ज़रूरत पड़ी, तो क्लास बदलना होगा।
वैसे, उल्टे क्रम (बड़े से छोटे) के लिए Collections.reverseOrder() का उपयोग कर सकते हैं:
Collections.sort(people, Collections.reverseOrder());\n\n\nतरीका 2: Comparator — क्लास बदले बिना लचीलापन
\n\nजब प्रोग्राम के अलग-अलग हिस्सों में अलग-अलग तरीकों से सॉर्ट करना हो, तो Comparator मददगार है। यह एक अलग क्लास या अनाम क्लास होता है जिसमें तुलना का लॉजिक होता है।
अनाम क्लास — पुराना तरीका
\n\nCollections.sort(people, new Comparator<Person>() {\n @Override\n public int compare(Person p1, Person p2) {\n return p1.getName().compareTo(p2.getName());\n }\n});\n\n\nकाम करता है, लेकिन भारी लगता है।