जावा 8 और उससे अधिक उत्तर (लैम्ब्डा एक्सप्रेशंस का उपयोग करके)
जावा 8 में, इसे और भी आसान बनाने के लिए लैम्ब्डा एक्सप्रेशन पेश किए गए थे! इसकी तुलना मचान के साथ एक तुलनित्र () ऑब्जेक्ट बनाने के बजाय, आप इसे निम्नानुसार सरल कर सकते हैं: (उदाहरण के लिए अपनी वस्तु का उपयोग करना)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
या इससे भी कम:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
यह एक कथन निम्नलिखित के बराबर है:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
लैम्ब्डा के भावों के बारे में सोचें क्योंकि आपको केवल कोड के संबंधित भागों में डालने की आवश्यकता होती है: विधि हस्ताक्षर और क्या वापस मिलता है।
आपके प्रश्न का एक और हिस्सा था कि कैसे कई क्षेत्रों के खिलाफ तुलना की जाए। ऐसा करने के लिए कि लैम्ब्डा अभिव्यक्ति के साथ, आप .thenComparing()
दो तुलनाओं को एक में प्रभावी ढंग से संयोजित करने के लिए फ़ंक्शन का उपयोग कर सकते हैं :
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
उपरोक्त कोड सूची को पहले timeStarted
और फिर timeEnded
उन रिकॉर्ड्स के लिए क्रमबद्ध करेगा (जिनके पास समान है timeStarted
)।
एक अंतिम नोट: 'लॉन्ग' या 'इंट' प्राइमिटिव्स की तुलना करना आसान है, आप बस एक को दूसरे से घटा सकते हैं। यदि आप वस्तुओं ('लंबी' या 'स्ट्रिंग') की तुलना कर रहे हैं, तो मेरा सुझाव है कि आप उनकी अंतर्निहित तुलना का उपयोग करें। उदाहरण:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
संपादित करें: मुझे .thenComparing()
काम करने के लिए इशारा करने के लिए लुकास ईडर का धन्यवाद ।