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

अधिकांश ग्राफ़िकल फ़ाइल प्रबंधक कड़ाई से शब्दकोषीय रूप से सॉर्ट नहीं करते हैं, बल्कि "प्राकृतिक सॉर्ट" का उपयोग करते हैं। नाम में संख्याओं के ब्लॉक को संख्याओं के रूप में समझा जाता है - संख्याओं का बड़ा ब्लॉक जीतता है, भले ही विपरीत विशुद्ध रूप से वर्णमाला के शब्दों में सामने आए। प्राकृतिक छँटाई के पीछे का विचार: लोग मुख्यतः "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;
}

Google Drive, OneDrive, KDE और इसी तरह की सेवाएं समान सॉर्टिंग व्यवहार प्रदर्शित करती हैं। CLI टूल जैसे... ls तथा find GUI फ़ाइल प्रबंधकों से भिन्न प्रकार से क्रमबद्ध करें। शब्दार्थ फ़ाइल नाम में हैं, एपीआई में नहीं। यदि आप आश्चर्य के बिना परिणाम चाहते हैं, तो परंपराओं को परिभाषित करें: सुसंगत विभाजक, गद्देदार संख्याएं और इकाइयों की स्पष्ट हैंडलिंग। तब "वर्णमाला" फिर से पूर्वानुमानित हो जाता है।

वापस