प्राकृतिक छँटाई क्रम में भ्रम

ज़्यादातर ग्राफ़िकल फ़ाइल मैनेजर पूरी तरह से शब्दकोश के अनुसार सॉर्ट नहीं करते, बल्कि "प्राकृतिक" सॉर्टिंग का इस्तेमाल करते हैं। नामों में संख्याओं के ब्लॉक को संख्याओं के रूप में समझा जाता है—संख्याओं का बड़ा ब्लॉक जीतता है, भले ही वर्णानुक्रम में विपरीत हो। प्राकृतिक सॉर्टिंग के पीछे का विचार: लोग आमतौर पर "10 से पहले 9", "अध्याय 10 से पहले अध्याय 2" चाहते हैं—बिना शुरुआती शून्य जोड़े।


निम्नलिखित फ़ाइल युग्म स्वाभाविक रूप से आरोही क्रम में इस प्रकार क्रमबद्ध हैं::

  • build-9e2.log
  • build-950.log

आश्चर्यजनक, लेकिन समझाने योग्य: पहला अंक \(9\) अंकों के पहले ब्लॉक \(950\) से छोटा है।

  • IMG_12113419_90.jpg
  • IMG_0554363070_90.jpg

संख्या \(12113419\) \(554363070\) से छोटी है (अग्रणी \(0\) हटा दिया गया है)।

  • temp_0C.txt
  • temp_2C.txt
  • temp_-3C.txt
  • temp_10C.txt
  • temp_-12C.txt

तुलना की गई संख्याएँ हैं \(0\) , \(2\) , \(3\) , \(10\) , \(12\) - “-” को संख्या का भाग नहीं माना जाता है।

यहाँ तक कि "वर्णमाला क्रम" भी वैश्विक रूप से स्पष्ट नहीं है: कैपिटलाइज़ेशन, ä (जर्मन) जैसे उमलॉट, या ch (चेक) जैसे बहु-वर्णी अक्षर वैध रूपांतरों की ओर ले जाते हैं। इसलिए "पूर्णतः वर्णानुक्रम" संदर्भ-निर्भर है। विंडोज़ एक्सप्लोरर इसे StrCmpLogicalW फ़ंक्शन में लागू करता है। हालाँकि इसका स्रोत कोड (shlwapi.dll) स्वामित्व वाला है और सार्वजनिक नहीं है, फिर भी ReactOS जैसे कई पुनर्कार्यान्वयन उपलब्ध हैं।:

{
    TRACE("%s, %s\n", wine_dbgstr_w(str), wine_dbgstr_w(comp));
 
    if (!str || !comp)
        return 0;
 
    while (*str)
    {
        if (!*comp)
            return 1;
        else if (*str >= '0' && *str <= '9')
        {
            int str_value, comp_value;
 
            if (*comp < '0' || *comp > '9')
                return -1;
 
            /* Compare the numbers */
            StrToIntExW(str, 0, &str_value);
            StrToIntExW(comp, 0, &comp_value);
 
            if (str_value < comp_value)
                return -1;
            else if (str_value > comp_value)
                return 1;
 
            /* Skip */
            while (*str >= '0' && *str <= '9') str++;
            while (*comp >= '0' && *comp <= '9') comp++;
        }
        else if (*comp >= '0' && *comp <= '9')
            return 1;
        else
        {
            int diff = ChrCmpIW(*str, *comp);
            if (diff > 0)
                return 1;
            else if (diff < 0)
                return -1;
 
            str++;
            comp++;
        }
    }
 
    if (*comp)
      return -1;
 
    return 0;
}

गूगल ड्राइव, वनड्राइव, केडीई और अन्य उपकरण भी इसी तरह का सॉर्टिंग व्यवहार प्रदर्शित करते हैं। ls तथा find हालाँकि, वे GUI फ़ाइल प्रबंधकों से अलग तरीके से क्रमबद्ध होते हैं। अर्थ-ज्ञान फ़ाइल नामों में होता है, API में नहीं। यदि आप बिना किसी आश्चर्य के परिणाम चाहते हैं, तो परंपराएँ निर्धारित करें: सुसंगत विभाजक, अतिरिक्त संख्याएँ, और इकाइयों का स्पष्ट प्रबंधन। तब "वर्णमाला क्रम" फिर से पूर्वानुमान योग्य हो जाता है।

वापस