Załóżmy, że wyświetlam dane użytkownikowi w postaci siatki, raportu, listy rozwijanej itp. Dane, o których mowa, zawierają pole o nazwie Numer faktury . To pole zawiera tylko cyfry 2/3 czasu, ale pozostała 1/3 czasu to mieszanka alfanumerycznych.

Z tego powodu każdy algorytm sortowania będzie sortował alfabetycznie, a nie numerycznie . Z tego powodu 1000 byłoby dużo przed 99. Ponieważ sortowana jest pierwsza cyfra – a nie cała wartość. Inne elementy, takie jak 000333, nie byłyby traktowane jako „333” i pojawiałyby się przed 222.

Czy jest tu jakaś norma? Czy powinienem próbować przekonwertować wszystkie wartości na wartości liczbowe i posortować je w inny sposób? Jak by się z powrotem zintegrowali? A może sortowanie alfanumeryczne jest właściwą drogą?

Komentarze

  • Jeśli masz możliwość powiedzenia, użyj podłańcucha do obcięcia pierwszych trzech cyfry, które mają alfabety i są sortowane wyłącznie na podstawie trzech ostatnich cyfr, w twoim przypadku powiedz ABC333 i 000222 – możesz to zaimplementować. Jasne, podczas wyświetlania przyjdzie w kolejności 000222, a potem ABC333. Jednak wizualnie byłoby trochę zagmatwane zobaczyć zera na tle kilku cyfr i alfabetów na tle innych. Co sugerują alfabety?
  • Różne długości, więc nie ma podciągów. Myślę, że " 10 " przyjdź przed " 9 " (właściwie FAR przed 9) byłoby mylące dla użytkowników, którzy ' nie używają często alfanumerycznych. Z drugiej strony, czysta ich mieszanina naprawdę ' nie może być posortowana w żaden przyjemny sposób, jaki widzę.
  • Jeśli to są faktury, czy możesz je posortować według daty, czy też konieczne jest sortowanie według samego numeru faktury? Może mógłbyś użyć innej kolumny z tabeli i odpowiednio je posortować. Zakładając, że są one generowane w kolejności rosnącej, miałby sens chronologiczny porządek faktur z najczęściej generowaną na górze, prawda? Nie jestem pewien, do czego właściwie służy lista rozwijana ani w jaki sposób użytkownik może skorzystać z tego sortowania. Gdybyś mógł nas bardziej oświecić na temat korzystania z tego pola, byłoby to o wiele bardziej pomocne!
  • To ' zależy od użytkownika. Mogą przeglądać te dane poprzez raportowanie, za pośrednictwem ekranu księgowego, który pozwala im sprawdzić salda w porównaniu z 30 siatką (zobacz wszystkie faktury od jednego dostawcy) itp. Użytkownik wybiera sposób sortowania ekranu lub raportu. Data jest opcją. Ale tak samo jak numer faktury. Nie są one generowane przez moją aplikację. Zamawiasz materiały eksploatacyjne, części itp. Od dostawców. Ten konkretny dostawca przywraca Ci numer faktury. Na przykład, jeśli złożyłeś zamówienie w pięciu sklepach internetowych i otrzymałeś pięć numerów zamówień. Niektóre są numeryczne, inne nie.
  • Należy przekonwertować te liczby na format liczbowy. Użyj tego tylko do sortowania wartości alfanumerycznych. Przekonwertowane liczby nie muszą być pokazywane użytkownikowi, aby spowodować więcej zamieszania. Zalecałbym jednak, aby na przykład mieć inną kolumnę – Data jako uzupełnienie alfanumerów. Ponieważ sortowanie alfanumerycznych będzie trochę mylące, inna kolumna, która pomoże użytkownikowi ustalić odpowiednią datę lub coś innego, bardzo by pomogło.

Odpowiedź

Począwszy od systemu Windows 7 firma Microsoft zmieniła domyślną metodę sortowania katalogów według nazwy pliku na sortowanie „numeryczne”. (Trochę informacji tutaj )

Chociaż nie mogłem znaleźć specyfikacji jego zachowania, udało mi się to odtworzyć. Ten algorytm powinien porównaj dwa ciągi alfanumeryczne i określ, który jest pierwszy.

  • Podziel każdą nazwę pliku na części alfabetyczne i numeryczne, tzn. nazwa text123moretext456 stanie się list {"text", "123", "moretext", "456"}

  • Dla każdej części w dwóch nazwach podziału wykonaj następujące porównanie:

    • Jeśli obie części są ściśle numeryczne, porównaj je jako liczby
      • Jeśli liczby są takie same, porównaj je jako ciągi
      • Jeśli ciągi są takie same, przejdź do następnej części
    • Jeśli obie części są ściśle literami, porównaj je jako ciągi znaków
      • Jeśli są takie same, przejdź do następnej części
  • Jeśli skończą się części, nazwa z najmniejszą liczbą to f irst

W końcu otrzymujesz zamówienie podobne do następującego:

2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a 

Komentarze

  • Dokładnie tego szukałem, a wynikowa kolejność sortowania ma sens. Dziękuję!

Odpowiedź

To pytanie (a zwłaszcza odpowiedź @Harrison Paine) pomogło mi mój projekt i chcę zapewnić implementację [javascript] jego odpowiedzi na przyszłość.Oto sortowanie function:

var win7sort = function(a, b) { var regex = /[^\d]+|\d+/g; // Split each filename into alphabetical and numeric parts var ar = a.match(regex); var br = b.match(regex); var localeCompare; // For each part in the two split names, perform the following comparison: for(var ia in ar) { for(var ib in br) { var ari = ar[ib]; if(ari == undefined) { ari = ""; } var bri = br[ib]; if(bri == undefined) { bri = ""; } // If both parts are strictly numeric, compare them as numbers if(!isNaN(ari) && !isNaN(bri)) { localeCompare = ari.localeCompare(bri, {}, { numeric: true }); } else { localeCompare = ari.localeCompare(bri, {}, { ignorePunctuation: true, sensitivity: "base" }); } if(localeCompare != 0) { // If you run out of parts, the name with the fewest parts comes first return localeCompare; } // If they"re the same, move on to the next part } } return localeCompare; }; 

A oto jak go używać:

var list = ["1", "a", "z", "new folder 2", "new folder 03", "new folder 03-a", "new folder 039", "new folder 5", "new folder 41", "2", "21", "3", "41", "100"]; var sortedList = list.sort(win7sort); 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *