Spuneți că afișez date unui utilizator într-o grilă, raport, casetă verticală etc. Datele în cauză conțin un câmp numit Număr de factură . Acest câmp conține doar numerice 2/3 din timp, dar celelalte 1/3 din timp sunt un amestec de alfa-numerice.

Din această cauză, orice algoritm de sortare ar sorta alfa numeric în loc de numeric . Din acest motiv, 1000 ar veni cu mult înainte de 99. Deoarece prima cifră este sortată pe – nu întreaga valoare. Alte articole precum 000333 nu ar fi tratate ca „333” și ar apărea înainte de 222.

Există vreun standard aici? Ar trebui să încerc să convertesc toate valorile într-o valoare numerică și să le sortez diferit? Cum s-ar integra din nou împreună? Sau sortarea alfa-numerică este calea corectă?

Comentarii

  • Dacă aveți capacitatea de a spune, folosiți șirul pentru a trunchia primele trei cifre care au alfabetele și se sortează numai pe baza ultimelor trei cifre, în cazul dvs. spun ABC333 și 000222 – ați putea implementa acest lucru. Sigur, în timp ce afișarea ar veni în ordinea 000222 și apoi ABC333. Cu toate acestea, din punct de vedere vizual, ar fi puțin confuz să vedem zerouri împotriva puține cifre și alfabete împotriva altora. Ce sugerează alfabetele?
  • Lungimile variate, deci fără sub-șir. Cred că a vedea ” 10 ” înainte de ” 9 ” (de fapt, FAR înainte de 9) ar fi confuz pentru utilizatorii care nu ‘ nu folosesc des numerele alfa. Pe de altă parte, un amestec pur dintre acestea nu poate ‘ să fie sortat în niciun mod frumos pe care îl văd.
  • Dacă acestea sunt facturi, le puteți sorta după dată sau este necesar în mod explicit să fie sortat în funcție de numărul facturii în sine? Poate ați putea folosi o altă Coloană din tabel și le puteți sorta în consecință. Presupunând că acestea sunt generate în ordine crescătoare, ar avea sens o ordine cronologică a facturilor cu cea mai frecventă generată în partea de sus, nu? Nu sunt sigur pentru ce este de fapt meniul derulant sau cum poate beneficia utilizatorul de acest tip. Dacă ne-ați putea afla mai multe despre utilizarea câmpului, ar fi mult mai util!
  • Depinde de utilizator ‘. Aceștia pot vizualiza aceste date prin raportare, printr-un ecran de contabilitate care le permite să verifice soldurile în raport cu Net 30 (consultați toate facturile de la un furnizor) etc. Utilizatorul alege modul în care vrea să fie sortat ecranul sau raportul. Data este o opțiune. Dar la fel este și numărul facturii. Acestea nu sunt generate de aplicația mea. Comandați consumabile, piese etc. de la furnizori. Furnizorul respectiv vă returnează un număr de factură. Ca și cum ai comanda de la cinci magazine online și ai primi cinci numere de comandă. Unele sunt numerice, altele nu.
  • Ar trebui să convertiți aceste numere într-un format numeric. Utilizați acest lucru numai pentru a sorta valorile alfanumerice. Numerele convertite nu trebuie afișate utilizatorului pentru a provoca mai multă confuzie. Cu toate acestea, v-aș recomanda să aveți o altă coloană, de exemplu – Data pentru a completa Alphanumerals. Deoarece sortarea alfanumerelor va fi puțin confuză, o altă coloană pentru a ajuta utilizatorul să afle data relevantă sau altceva ar ajuta mult.

Răspuns

Începând cu Windows 7, Microsoft și-a schimbat metoda implicită de sortare a directoarelor după numele fișierului pentru a utiliza sortarea „numerică”. (Câteva informații aici )

Deși nu am putut găsi o specificație a comportamentului său, am reușit să-l ingineresc invers. Acest algoritm ar trebui comparați două șiruri alfanumerice și determinați care dintre acestea este primul.

  • Împărțiți fiecare nume de fișier în părți alfabetice și numerice; adică numele text123moretext456 devine listă {"text", "123", "moretext", "456"}

  • Pentru fiecare parte din cele două nume divizate, efectuați următoarea comparație:

    • Dacă ambele părți sunt strict numerice, comparați le ca numere
      • Dacă numerele sunt aceleași, comparați-le ca șiruri
      • Dacă șirurile sunt aceleași, treceți la partea următoare
    • Dacă ambele părți sunt strict litere, comparați-le ca șiruri
      • Dacă „sunt la fel, treceți la partea următoare
  • Dacă rămâneți fără piese, numele cu cele mai puține piese vine f primul

Veți ajunge la o comandă ca următoarea:

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

Comentarii

  • Este exact ceea ce căutam, iar ordinea de sortare rezultată are sens. Mulțumesc!

Răspuns

Această întrebare (și în special răspunsul lui @Harrison Paine) m-a ajutat să proiectul meu și vreau să ofer implementarea [javascript] a răspunsului său pentru referințe viitoare.Iată sortarea 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; }; 

Și iată cum să o utilizați:

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); 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *