2012-01-15 10 views
8

वर्तमान में मैं एक तुलना लिख ​​रहा हूं फॉर्म में वर्गबद्ध कार्यों के लिए विधि: ax^2 + bx + c।तुलनात्मक तरीके से तुलना करने के लिए आप कैसे कार्यान्वित करते हैं?

ए, बी, सी पूर्णांक गुणांक हैं जो कि कन्स्ट्रक्टर के माध्यम से कक्षा में पास किए जाते हैं।

तुलना में तुलना में, मुझे पहले दो गुणों के बीच एक गुणांक की तुलना करना चाहिए, लेकिन यदि वे बराबर हैं, तो मैं बी-गुणांक की तुलना करता हूं। यदि बी बराबर है, तो मैं सी की तुलना करता हूं।

विधि है कि मैं इस के लिए आया था बहुत बदसूरत जा रहा समाप्त हो गया:

public int compareTo(QuadraticFunction other) 
{ 
    if (a > other.a) 
     return 1; 
    else if (a < other.a) 
     return -1; 
    else if (b > other.b) 
     return 1; 
    else if (b < other.b) 
     return -1; 
    else if (c > other.c) 
     return 1; 
    else if (c < other.c) 
     return -1; 
    else 
     return 0; 
} 

तो मैं, सोच रहा था कि आप तुलना की इन "बहुस्तरीय" सिस्टम है (जैसे ख के पहले के तुलना सी के पहले), उन्हें लागू करने का सबसे अच्छा तरीका क्या है? अगर आप 10+ चर के माध्यम से जाना है तो मैं अपनी तरह की एक विधि लिखने की कल्पना नहीं कर सकता।

उत्तर

6

गुणांक की एक मनमानी संख्या (सभी प्रकार के समान) के लिए, आपको व्यक्तिगत रूप से नामित सदस्य चर के बजाय उन्हें List (या कुछ समान) में स्टोर करना चाहिए। इससे आप अपने उदाहरण कोड को पुनरावृत्ति में परिवर्तित कर सकते हैं।

+0

मदद के लिए धन्यवाद! – CowZow

+1

यह केवल तभी काम करता है जब सभी चर के समान प्रकार होते हैं। –

+0

@ लुइस वासरमैन: यह सही है। लेकिन मुझे लगता है कि यह मानना ​​काफी सुरक्षित है कि एक समरूप गुणांक वाले बहुपद गुणांक का प्रतिनिधित्व करेगा। –

0

आप नीचे की तरह एक मुहावरे का उपयोग कर सकते हैं जो फ़ील्ड द्वारा स्पष्ट अनुभागों में तुलना को तोड़ता है, केवल प्रति फ़ील्ड के लिए एक परीक्षण की आवश्यकता होती है, और वापसी मूल्यों का उत्पादन करने के लिए signum विधि का उपयोग करती है।

ध्यान दें, int के लिए काम करता है नीचे घटाव, short, char, या byte क्षेत्रों। long, float, और double फ़ील्ड के लिए आपको ओवरफ्लो/अंडरफ्लो से बचने के लिए < और == के लिए अलग-अलग चेक का उपयोग करना होगा, और गोल करने के कारण परिशुद्धता का नुकसान होना चाहिए। फ़्लोटिंग पॉइंट मानों की तुलना करते समय भी NaN से सावधान रहें। Comparable फ़ील्ड के लिए, आप null को संभालने के लिए अलग-अलग स्थितियों का उपयोग करने के बाद compareTo के परिणामस्वरूप डेल्टा सेट कर सकते हैं।

long delta = ((long) a.field1) - b.field1; 
if (delta != 0) { return Long.signum(delta); } 

delta = ((long) a.field2) - b.field2; 
if (delta != 0) { return Long.signum(delta); } 

... 

return 0; 
+0

यह केवल तभी काम करेगा यदि 'a.field1' और सह सबसे पूर्णांक पर हैं। – Voo

+0

@Voo, सच है। ओपी का कहना है "ए, बी, सी पूर्णांक गुणांक हैं"। –

+0

आह प्रश्न पढ़ने के दौरान मैंने शब्द की गणितीय भावना में "पूर्णांक गुणांक" का अर्थ दिया, लेकिन हां यह शायद अधिक संभावना है कि वह वास्तव में पूर्णांक int का मतलब था। फिर भी मुझे लगता है कि इस मुहावरे का उपयोग करते समय एक बड़ी वसा चेतावनी महत्वपूर्ण होती है: दशकों से इसका दुरुपयोग किया जाता है, इसलिए मैं इसके साथ थोड़ा सावधान हूं। – Voo

1

पठनीयता के लिए, और बिल्ट-इन का उपयोग करने की तुलना एक, ख, ग के लिए तरीके, मैं इस के लिए refactor होगा:

public int compareTo(QuadraticFunction other) { 
    if (a.equals(other.a)) { 
     if (b.equals(other.b)) 
      return c.compareTo(other.c); 
     return b.comapreTo(other.b); 
    } 
    return a.compareTo(other.a); 
} 

इस कोड को मान लिया गया क्षेत्रों Number हैं। यदि वे एक आदिम हैं, तो उन्हें या तो लिपटे प्रकार में परिवर्तित करें या a.equals(b) to एक == बी and change a.compareTo (बी) to ए-बी` बदलें।

यह भी ध्यान दें कि if रिटर्न होने पर, else की आवश्यकता नहीं होती है - यह अनावश्यक है, इसलिए इसे हटा दें।

+0

कोई तर्क दे सकता है कि 'else' को बनाए रखने से रिफैक्टरिंग की सुविधा मिलती है। ओपी के मामले में, वह बाद में कोड को 'if (cond1) {retval = 1 में बदलने का निर्णय ले सकता है; } और अगर (cond2) {retval = -1; } और ... वापसी वापसी; '। –

2

Guava Libraries इसे ComparisonChain नामक एक बहुत अच्छा टूल प्रदान करता है।

आपका कोड कुछ इस तरह दिखेगा:

import com.google.common.base.ComparisonChain; 
... 
public int compareTo(QuadraticFunction other) { 
    return ComparisonChain.start() 
    .compare(a, other.a) 
    .compare(b, other.b) 
    .compare(c, other.c) 
    .result(); 
} 
+0

क्या नया जावा 8 'तुलनाकर्ता' एपीआई अपने स्वयं के उत्तर की गारंटी देगा, या क्या हमें इसे वहां विलय करना चाहिए? –

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

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