2011-09-01 12 views
5

मैं एक छोटी कक्षा पर Comparable इंटरफ़ेस को कार्यान्वित कर रहा हूं जो एक int सदस्य को लपेटता है।क्या आदिम प्रकार के मानों की तुलना करने के लिए कोई पुस्तकालय है?

मैं इसे इस तरह से लागू कर सकते हैं:

@Override 
    public int compareTo (final MyType o) 
    { 
     return 
      Integer.valueOf(this.intVal).compareTo(
       Integer.valueOf(o.intVal) 
      ); 
    } 

लेकिन इस (हो सकता है) बनाता है 2 पूरी तरह से अनावश्यक पूर्णांक वस्तुओं।

या मैं पूर्णांक वर्ग से करने की कोशिश की जा सकते हैं और सच्चे कट और पेस्ट दृष्टिकोण:

@Override 
    public int compareTo (final MyType o) 
    { 
     int thisVal = this.intValue; 
     int anotherVal = o.intValue; 
     return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); 
    } 

यह सुंदर कुशल है, लेकिन डुप्लिकेट कोड अनावश्यक।

क्या ऐसी कोई लाइब्रेरी है जो इस अनुपलब्ध Integer (और डबल और फ़्लोट) विधि को कार्यान्वित करेगी?

public static int compare (int v1, int v2); 
+1

क्या आप इंटीजर 'तुलना करने के लिए()' को एक नई विधि में कॉपी कर सकते हैं जो 'इस' का उपयोग करने के बजाय दो तर्क लेता है? – BenCole

उत्तर

6

जावा 7, आदिम प्रकार के लिए static int compare में सभी आदिम वस्तु आवरण वर्गों के लिए जोड़ दिया गया है, यानी वहाँ अब है:

java.lang.Integer: static int compare(int x, int y); 
java.lang.Byte: static int compare(byte x, byte y); 
java.lang.Short: static int compare(short x, short y); 
etc... 
2

शायद, मुझे कुछ याद आ रहा है, लेकिन IMHO यह एक अजीब सवाल है।

वहाँ एक पुस्तकालय है कि इस लापता Integer (और डबल और फ्लोट) लागू करेगा विधि है?

public static int compare (int v1, int v2); 

खैर, मैं इस काम करता है लगता है:

public static int compare (int v1, int v2) 
{ 
    if (v1 < v2) return -1; 
    if (v1 > v2) return 1; 
    return 0; 
} 
+1

आम तौर पर, कोड सिर्फ 'वापसी v1 - v2; ' – barjak

+2

@barjak: नहीं, कृपया http://stackoverflow.com/questions/7273091/is-there-a-library-to-compare-primitive-type- मूल्य/7273222 # 7273222 और यह टिप्पणी करता है। –

6
  • int के लिए, अपने खुद के compare विधि लिखने (यह कोड की ज्यादा से ज्यादा तीन लाइनों की आवश्यकता है)।
  • double के लिए, Double.compare का उपयोग करें ( compareTo के साथ भ्रमित न होने के लिए)।
  • float के लिए, Float.compare का उपयोग करें।

अंतिम दो प्राचीन प्रकार लेते हैं और इस प्रकार मुक्केबाजी और अनबॉक्सिंग से बचते हैं। मैं Integer के लिए एक समान compare विधि प्रदान करने के लिए एक तर्क देख सकता हूं, लेकिन चीजों के रूप में यह खड़ा नहीं है।

+1

'इंटेगर' में' तुलना ' –

+0

@ स्टेव कुओ है: कृपया जवाडोक से लिंक करें? – NPE

+0

आप सही हैं। मैं 'तुलना करने के लिए' सोच रहा था, इस मामले में वह 'Integer.valueOf (i1) .compareTo (i2) 'कर सकता था। –

-1

यह समाधान आसान है, लेकिन शायद साधारण है:

public static int compare (int v1, int v2) 
{ 
    return v1 - v2; 
} 

नोट: @aix सही है! यह दृष्टिकोण मनमाने ढंग से पूर्णांक के लिए काम नहीं करेगा। यह उदाहरण स्वचालित रूप से जेनरेट डेटाबेस कुंजी आदि के लिए, हालांकि हमेशा धनात्मक पूर्णांक के लिए काम करेंगे

+6

पूर्णांक अतिप्रवाह के बारे में कैसे? – NPE

+1

@Martijn Courteaux, आप गलत हैं, 'तुलना करें' और 'तुलना करें' नकारात्मक, 0, सकारात्मक मान निर्दिष्ट करें। यह -1, 0 को निर्देशित नहीं करता है 1. कोई भी कोड जो -1 के लिए जांचता है वह खराब और टूटा हुआ कोड है। Http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 –

+1

देखें, जवाडोक तुलनात्मक और शून्य दोनों के लिए "नकारात्मक, शून्य या सकारात्मक" कहता है, पूर्णांक। – barjak

संबंधित मुद्दे