2016-06-23 2 views
6

मेरी जावा कक्षाओं में से एक में मेरे पास ये 2 बहुत ही समान कार्य हैं। जावा में एक समारोह में गठबंधन करने का कोई तरीका है इसलिए मुझे 2 कार्यों को बनाए रखने की ज़रूरत नहीं है?समान जावा फ़ंक्शंस को एक में कैसे जोड़ें (सी ++ में मैं टेम्पलेट्स का उपयोग करूंगा)

public static boolean areValuesValid(double [] values, int numElements) { 
    if(values == null || values.length != numElements) { 
     return false; 
    } 
    for(int i = 0; i < numElements; ++i) { 
     if(Double.isNaN(values[i])) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean areValuesValid(float [] values, int numElements) { 
    if(values == null || values.length != numElements) { 
     return false; 
    } 
    for(int i = 0; i < numElements; ++i) { 
     if(Float.isNaN(values[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

कोड जनरेटर का उपयोग करने पर विचार करें, उदा। https://github.com/square/javapoet – midor

+0

ध्यान दें कि C++ टेम्पलेट का उपयोग करके समान कार्यों को एक साथ जोड़ता नहीं है; टेम्पलेट्स प्रत्येक अलग-अलग प्रकार के लिए एक नया फ़ंक्शन उत्पन्न करते हैं। –

+0

@ लू ब्लोच, हाँ यह सच है लेकिन मैं सी + एच मुझे केवल दो के बजाय अपने स्रोत कोड में एक टेम्पलेट फ़ंक्शन को बनाए रखने की आवश्यकता है। –

उत्तर

4

@ericbn समझाए गए कारणों के लिए यह आदर्श परिदृश्य नहीं है। लेकिन लैम्बडा का उपयोग करके अधिकांश डुप्लिकेशंस से बचने के लिए यहां एक तरीका है:

public static boolean areValuesValid(double [] values, int numElements) { 
    return areValuesValid(values, numElements, i -> !Double.isNaN(values[i])); 
} 

public static boolean areValuesValid(float[] values, int numElements) { 
    return areValuesValid(values, numElements, i -> !Float.isNaN(values[i])); 
} 

private static boolean areValuesValid(Object values, int numElements, IntPredicate tester) { 
    if(values == null || Array.getLength(values) != numElements) { 
     return false; 
    } 
    for(int i = 0; i < numElements; ++i) { 
     if(!tester.test(i)) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

बहुत अच्छा धन्यवाद! फॉर-लूप के अंदर केवल एक छोटा सा तर्क सुधार की आवश्यकता है। अगर-कथन को अस्वीकार नहीं किया जाना चाहिए। –

+0

@ MarekKnows.com फिक्स्ड, धन्यवाद। – shmosel

5

आपका प्रश्न जावा के लिए कुछ मायनों में मुश्किल है:

  1. double और float आदिम प्रकार के होते हैं, और इस तरह के रूप में वे एक वर्ग पदानुक्रम का हिस्सा नहीं हैं। आवरण Double और Float कक्षाएं Number, जो Object फैली हुई है, लेकिन
  2. आदिम प्रकार की एक सरणी में ऑब्जेक्ट की श्रृंखला के समान नहीं है फैली हुई है, और जावा उदाहरण के लिए, एक float[]Float[] को autobox नहीं है।
  3. जावा एपीआई में isNan(Number n) या isNan(Object o) विधि नहीं है, लेकिन आपके द्वारा उपयोग किए जाने वाले उपरोक्त वाले, double या float की अपेक्षा करते हैं। हालांकि, आप किसी भी Number n के लिए Double.isNan(n.doubleValue()) कर सकते हैं।

टी एल; डॉ जावा में आदिम प्रकार के लिए आम बात है, उनमें से हर एक के लिए अलग से कार्यान्वयन के लिए की तरह तुमने किया है।

संपादित करें: रूप @azurefrog सुझाव:

public static boolean areValuesValid(Number[] values, int numElements) { 
    if (values == null || values.length != numElements) { 
     return false; 
    } 
    for (Number value : values) { 
     if (Double.isNaN(value.doubleValue())) { 
      return false; 
     } 
    } 
    return true; 
} 

और फिर आप अपाचे कॉमन्स उपयोग करने के लिए होगा ArrayUtils:

public static boolean areValuesValid(double[] values, int numElements) { 
    return areValuesValid(ArrayUtils.toObject(values), numElements); 
} 

public static boolean areValuesValid(float[] values, int numElements) { 
    return areValuesValid(ArrayUtils.toObject(values), numElements); 
} 

EDIT2: @ shmosel के समाधान के रूप में सरणी गुजरता एक Object और वहां से पूरे सरणी के रूपांतरण को बॉक्स किए गए प्रकार से बचाता है। उस ओवरहेड से बचने के लिए विचार करने का एक समाधान।

+0

आपके तीसरे बिंदु के बारे में, 'संख्या # डबलवैल्यू()' विधि है, इसलिए आप किसी भी 'संख्या' के डबल आउट को खींच सकते हैं और उस पर' Double.isNaN() 'कॉल कर सकते हैं। – azurefrog

+0

आपके दूसरे बिंदु के बारे में, अपाचे [एक ArrayUtils वर्ग है] (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#toObject (डबल [])) यदि आप तीसरे पक्ष के पुस्तकालयों में खींचने के इच्छुक हैं, तो आपके लिए प्राइमेटिव्स के ऑटोबॉक्स सरणी होंगे। – azurefrog

-3

चीजों को आसान बनाने के लिए, मैं के कहने का प्रयोग करेंगे:

public static boolean areValuesValid(Object[] values) { 
    if (values == null) { 
     return false; 
    } 
    for(int i = 0; i < values.length; ++i) { 
     //if not Float and not Double return false 
     if (values[i] instanceof Float || values[i] instanceof Double) { 
      return true; 
     } 
    } 
    return false; 
} 

मुझे यकीन है कि यदि आप वास्तव में numElements में पारित करना होगा नहीं हूँ।

+0

'फ्लोट []' ऑब्जेक्ट [] 'का उप-वर्ग नहीं है। – shmosel

+0

आप ओपी से अलग सत्यापन मानदंडों की जांच कर रहे हैं, जो यह देखने के लिए परीक्षण कर रहा है कि सरणी की लंबाई क्या अपेक्षित है, और क्या इसमें कोई गैर-संख्या मान शामिल है या नहीं। – azurefrog

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