2010-03-02 13 views
7

मैं यह निर्धारित करना चाहता हूं कि एक संस्करण संख्या दूसरे से अधिक है या नहीं। संस्करण संख्या निम्न में से कोई हो सकता है:वास्तविक संख्याओं को पार्सिंग संस्करण संख्या

4,2

4.22.2

4.2.2.233

... के रूप में संस्करण संख्या है मेरे नियंत्रण से परे, इसलिए मैं नहीं कह सकता कि संख्या में कितने बिंदु वास्तव में मौजूद हो सकते हैं।

के बाद से संख्या वास्तव में एक वास्तविक संख्या नहीं है, मैं बस यह नहीं कह सकते,

Is 4.7 > 4.2.2 

मैं कैसे एक वास्तविक संख्या है कि जाँच की जा सकता है में 4.2.2 के रूप में एक नंबर परिवर्तित करने, इस तरह के बारे में जा सकते हैं एक और संस्करण संख्या के खिलाफ?

मैं अधिमानतः एक ColdFusion समाधान है, लेकिन मूल अवधारणा की तरह भी ठीक हो जाएगा।

उत्तर

6

यह Mango Blog में प्लगइन अद्यतन कोड से फट, और एक छोटा सा अद्यतन किया जाता है। यह वही करना चाहिए जो आप चाहते हैं। यह 1 लौटाता है जब तर्क 1 अधिक होता है, -1 जब तर्क 2 अधिक होता है, और 0 जब वे सटीक मिलान होते हैं। (ध्यान दें कि 4.0.1 4.0.1.0 करने के लिए एक सटीक मिलान हो जाएगा)

यह सरणियों के बजाय, सीएफ सूची कार्यों का उपयोग करता है, तो आप एक छोटे से प्रदर्शन वृद्धि देख सकते हैं यदि आप इसके बजाय सरणियों में स्विच ... लेकिन हे , यह काम करता हैं!

function versionCompare(version1, version2){ 
    var len1 = listLen(arguments.version1, '.'); 
    var len2 = listLen(arguments.version2, '.'); 
    var i = 0; 
    var piece1 = ''; 
    var piece2 = ''; 

    if (len1 gt len2){ 
     arguments.version2 = arguments.version2 & repeatString('.0', len1-len2); 
    }else if (len2 gt len1){ 
     arguments.version1 = arguments.version1 & repeatString('.0', len2-len1); 
    } 

    for (i=1; i lte listLen(arguments.version1, '.'); i=i+1){ 
     piece1 = listGetAt(arguments.version1, i, '.'); 
     piece2 = listGetAt(arguments.version2, i, '.'); 

     if (piece1 neq piece2){ 
      if (piece1 gt piece2){ 
       return 1; 
      }else{ 
       return -1; 
      } 
     } 
    } 

    //equal 
    return 0; 
} 

अपने उदाहरण परीक्षण चल रहा है:

<cfoutput>#versionCompare('4.7', '4.2.2')#</cfoutput> 

प्रिंट:

1

पार्स अलग संख्या और उन्हें iteratively की तुलना करें।

if (majorVersion > 4 && 
    minorVersion > 2 && 
    revision > 2) 
{ 
    // do something useful 
} 

// fail here 

यह स्पष्ट रूप से सीएफ कोड नहीं है, लेकिन आपको विचार मिलता है।

+0

वास्तव में, यह है: डी यही कारण है कि पूरी तरह से वैध CFScript (CF8 + या BD/Railo) सही नहीं है। :) –

0

आप अवधि के साथ संस्करण युक्त स्ट्रिंग को विभाजित कर सकते हैं, फिर पहले इंडेक्स पर शुरू करें और जब तक कि एक दूसरे से अधिक न हो, तब तक तुलना करें (या यदि वे बराबर हैं, तो एक मूल्य दूसरे में नहीं है)।

मुझे डर है कि मैंने कभी भी ठंडा करने में लिखा नहीं है, लेकिन यह मूल तर्क होगा जिसका मैं पालन करता हूं।

यह एक किसी न किसी unoptimized उदाहरण है:

bool IsGreater(string one, string two) 
{ 
    int count; 
    string[] v1; 
    string[] v2; 

    v1 = one.Split("."); 
    v2 = two.Split("."); 

    count = (one.Length > two.Length) ? one.Length : two.Length; 

    for (int x=0;x<count;x++) 
    { 
    if (Convert.ToInt32(v1[x]) < Convert.ToInt32(v2[x])) 
     return false; 
    else if (Convert.ToInt32(v1[x]) > Convert.ToInt32(v2[x]) 
     return true; 
    } // If they are the same it'll go to the next block. 

    // If you're here, they both were equal for the shortest version's digit count. 
    if (v1.Length > v2.Length) 
    return true; // The first one has additional subversions so it's greater. 
} 
1

एक संस्करण संख्या मूल रूप से, संख्या की अवधि सीमांकित सरणी है तो आप संख्या विन्यास में, दोनों संस्करणों पार्स कर सकते हैं, और उसके बाद करने के लिए पहली सरणी में प्रत्येक तत्व की तुलना दूसरी सरणी में संबंधित तत्व।

सरणी पाने के लिए, कार्य करें:

<cfset theArrayofNumbers = listToArray(yourVersionString, ".")> 

और फिर आप अपने तुलना कर सकते हैं।

0

यदि प्रत्येक भाग के आकार पर कोई प्रतिबंध नहीं है (उदाहरण के लिए 4.702.0> 4.7.2?) है तो एकाधिक भाग संस्करण संख्याओं को वास्तविक संख्या में परिवर्तित करने का कोई सामान्य तरीका नहीं है।

आम तौर पर आप एक दृश्य या संस्करण संख्या भागों या घटकों, इसलिए 4.7.2 के रूप में प्रस्तुत किया जाता है की सरणी बनाने के द्वारा एक कस्टम तुलना समारोह को परिभाषित करेगा [4, 7, 2] और 4.702.0 है [ 4, 702, 0]। तो फिर तुम दो सरणियों के प्रत्येक तत्व की तुलना जब तक वे मेल नहीं खाते:

left = [4, 7, 2] 
right = [4, 702, 0] 

# check index 0 
# left[0] == 4, right[0] == 4 
left[0] == right[0] 
# equal so far 

# check index 1 
# left[1] == 7, right[1] == 702 
left[1] < right[1] 
# so left < right 

मैं ColdFusion के बारे में पता नहीं है, लेकिन कुछ भाषाओं में आप सरणियों या दृश्यों के साथ एक प्रत्यक्ष तुलना कर सकते हैं।उदाहरण के लिए, पायथन में:

>>> left = [4, 7, 2] 
>>> right = [4, 702, 0] 
>>> left < right 
True 
3

संस्करण 4 वास्तव में 4.0.0, और संस्करण का मतलब है, तो 4.2 वास्तव में 4.2 का मतलब है। 0, आप आसानी से संस्करण को एक साधारण पूर्णांक में परिवर्तित कर सकते हैं।

लगता है कि संस्करण के हर हिस्से 0 से 99 के बीच है, तो आप इस तरह XYZ से एक 'पूर्णांक संस्करण' गणना कर सकते हैं:

Version = X*100*100 + Y*100 + Z 

पर्वतमाला बड़ा या छोटा आप इस्तेमाल कर सकते हैं कारकों उच्च रहे हैं या की तुलना में कम 100

संस्करण की तुलना करना तो आसान हो जाता है।

+1

आम तौर पर यह एक बुरा विचार नहीं है, लेकिन उन्होंने विशेष रूप से कहा था, "संस्करण संख्या मेरे नियंत्रण से बाहर है" जिसका अर्थ है कि संस्करण संख्या 2.454359043859043.6 हो सकती है, जिसका आपका दृष्टिकोण असफल हो जाएगा। –

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