Kebingungan ing urutan ngurutake alam

Umume manajer file grafis ora ngurutake kanthi leksikografis, nanging nggunakake pangurutan "alami". Blok nomer ing jeneng diinterpretasikake minangka nomer - blok nomer sing luwih gedhe sing menang, sanajan kosok balene bakal bener miturut abjad. Gagasan ing mburi ngurutake alam: Sing dikarepake wong yaiku "9 sadurunge 10," "Bab 2 sadurunge Bab 10" -tanpa kudu nambah nol utama.


Pasangan file ing ngisor iki kanthi alami diurutake kanthi urutan munggah kaya ing ngisor iki:

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

Apik banget, nanging bisa diterangake: Digit pisanan \(9\) luwih cilik tinimbang blok digit pisanan \(950\) .

  • IMG_12113419_90.jpg
  • IMG_0554363070_90.jpg

Nomer \(12113419\) kurang saka \(554363070\) (utamane \(0\) dibusak).

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

Angka sing dibandhingake yaiku \(0\) , \(2\) , \(3\) , \(10\) , \(12\) - "-" ora dianggep minangka bagéan saka nomer kasebut.

Malah "alfabetis" ora ambigu sacara global: Kapitalisasi, umlaut kaya ä (Jerman), utawa aksara multi-karakter kaya ch (Ceko) mimpin kanggo varian sah. Mulane, "Sejatine alfabet" gumantung konteks. Windows Explorer nindakake iki ing fungsi StrCmpLogicalW . Nalika kode sumber sawijining (shlwapi.dll) kepemilikan lan ora umum, ana reimplementations, contone, saka 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, lan liya-liyane nampilake prilaku ngurutake sing padha. Alat CLI kaya ls lan find Nanging, padha ngurutake beda saka manajer file GUI. Semantik ana ing jeneng berkas, ora ana ing API. Yen sampeyan pengin asil tanpa surprises, netepake konvènsi: separator konsisten, nomer empuk, lan penanganan cetha saka Unit. Banjur "abjad" dadi bisa ditebak maneh.

Bali