Sortowanie ciągów zawierających liczby w przyjazny dla użytkownika sposób
Przyzwyczajając się do standardowego sposobu sortowania ciągów, byłem zaskoczony, gdy zauważyłem, że Windows sortuje pliki według ich nazw w pewien zaawansowany sposób. Dam ci przykład:
Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3
Myślę, że te nazwy są porównywane (podczas sortowania) na podstawie liter i liczb oddzielnie.
Z drugiej strony, ta sama lista jest posortowana w standardowy sposób:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3
Chciałbym stworzyć porównujący alogorytm w Delphi, który pozwoliłby mi sortować ciągi w ten sam sposób. Na początku myślałem, że wystarczy porównać kolejne znaki dwóch łańcuchów, gdy są one literami. Gdy w jakiejś pozycji obu strun znajdziemy cyfrę, czytam wszystkie cyfry następujące po nich, aby utworzyć liczbę, a następnie porównać liczby.
Aby dać przykład, porównam ciągi „Track10” i „Track2” w ten sposób:
1) czytaj znaki, gdy są równe, a gdy są literami: „Track”, „Track”
2) jeśli zostanie znaleziona cyfra, przeczytaj wszystkie następujące cyfry: „10”, „2”
2a) jeśli są równe, przejdź do 1 lub zakończ
Dziesięć jest większe niż dwa, więc „Track10” jest większy niż „Track2”
Wydawało się, że wszystko będzie dobrze, dopóki w trakcie testów nie zauważyłem, że Windows uważał „Track010” za niższy niż „Track10”, podczas gdy myślałem, że pierwszy był większy, ponieważ był dłuższy (nie wspominając o tym, że zgodnie z moim algorytmem oba łańcuchy byłyby równe, co jest błędne).
Czy możesz mi powiedzieć, w jaki sposób system Windows sortuje pliki według nazw, a może masz gotowy algorytm (w dowolnym języku programowania), na którym mógłbym bazować?
Wielkie dzięki!
Mariusz