मैं compareTo()
इस तरह के रूप में एक साधारण वर्ग के लिए विधि लागू कर रहा हूँ ( Collections.sort()
जावा प्लेटफ़ॉर्म द्वारा उपयोग किए जाने वाले और अन्य उपहार देने में सक्षम होने के लिए ):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
मैं चाहता हूं कि इन वस्तुओं के लिए प्राकृतिक ऑर्डरिंग हो: 1) नाम द्वारा क्रमबद्ध और 2) मान द्वारा क्रमबद्ध अगर नाम समान है; दोनों तुलना मामले-असंवेदनशील होनी चाहिए। दोनों क्षेत्रों के लिए अशक्त मूल्य पूरी तरह से स्वीकार्य हैं, इसलिए compareTo
इन मामलों में नहीं टूटना चाहिए।
समाधान जो मन को स्प्रिंग्स करता है, वह निम्नलिखित की पंक्तियों के साथ है (मैं "गार्ड क्लॉस" का उपयोग कर रहा हूं जबकि अन्य एक एकल वापसी बिंदु पसंद कर सकते हैं, लेकिन यह बिंदु के बगल में है):
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && other.name != null) {
int result = this.name.compareToIgnoreCase(other.name);
if (result != 0){
return result;
}
}
if (this.value == null) {
return other.value == null ? 0 : -1;
}
if (other.value == null){
return 1;
}
return this.value.compareToIgnoreCase(other.value);
}
यह काम करता है, लेकिन मैं इस कोड से पूरी तरह से खुश नहीं हूं। माना जाता है कि यह बहुत जटिल नहीं है, लेकिन काफी वाचाल और थकाऊ है।
सवाल यह है कि आप इस क्रिया को कम कैसे करेंगे (कार्यक्षमता को बनाए रखते हुए)? यदि वे मदद करते हैं तो जावा मानक पुस्तकालयों या अपाचे कॉमन्स को संदर्भित करने के लिए स्वतंत्र महसूस करें। क्या इसे (थोड़ा) सरल बनाने का एकमात्र विकल्प मेरे अपने "NullSafeStringComparator" को लागू करना और इसे दोनों क्षेत्रों की तुलना करने के लिए लागू करना होगा?
संपादन 1-3 : एडी का अधिकार; ऊपर "दोनों नाम शून्य हैं" मामला तय किया गया
स्वीकृत उत्तर के बारे में
मैंने यह सवाल 2009 में जावा 1.6 के पाठ्यक्रम पर वापस पूछा था, और उस समय एडी द्वारा शुद्ध JDK समाधान मेरे लिए स्वीकृत उत्तर था। मुझे अब (2017) तक बदलने के लिए कभी नहीं मिला।
वहाँ भी 3 पार्टी पुस्तकालय समाधान कर रहे हैं - 2009 Apache कॉमन्स संग्रह एक और एक 2013 अमरूद दोनों, मेरे द्वारा पोस्ट - कि मैं कुछ समय में पसंद किया था।
मैंने अब लुकास विकटोर द्वारा स्वीकृत जावा 8 समाधान को स्वीकार कर लिया। यदि निश्चित रूप से जावा 8 पर पसंद किया जाना चाहिए, और इन दिनों जावा 8 लगभग सभी परियोजनाओं के लिए उपलब्ध होना चाहिए।