Sig, at jeg viser data til en bruger i et gitter, rapport, rullemenu osv. De pågældende data indeholder et felt kaldet Fakturanummer . Dette felt indeholder kun numerik 2/3 af tiden, men den anden 1/3 af tiden er en blanding af alfanumerik.

På grund af dette vil enhver sorteringsalgoritme sortere alfa numerisk i stedet for numerisk . Af denne grund ville 1000 komme langt før 99. Fordi det første ciffer er sorteret på – ikke hele værdien. Andre ting som 000333 ville ikke blive behandlet som “333” og ville dukke op inden 222.

Er der nogen standard her? Skal jeg forsøge at konvertere alle værdier til en numerisk værdi og sortere dem forskelligt? Hvordan bliver de integreret igen? Eller sorterer alfanumerisk den rigtige vej?

Kommentarer

  • Hvis du har evnen til at sige, skal du bruge substring til at afkorte de første tre cifre, der har alfabeterne og sorterer udelukkende ud fra de sidste tre cifre, i dit tilfælde siger ABC333 og 000222 – du kunne implementere dette. Sikker på, at mens den vises, ville den komme i rækkefølgen 000222 og derefter ABC333. Men visuelt ville det være lidt forvirrende at se nuller mod få tal og alfabeter mod andre. Hvad foreslår alfabeterne?
  • Varierende længder, så ingen SubString. Jeg tror at se ” 10 ” komme før ” 9 ” (faktisk FAR før 9) ville være forvirrende for brugere, der ikke bruger ‘ t ofte alfanumeriske tal. På den anden side kan en ren blanding af disse virkelig ‘ ikke sorteres på en pæn måde, som jeg kan se.
  • Hvis dette er fakturaer, kan du sortere dem efter dato eller er det udtrykkeligt nødvendigt at sortere efter fakturanummeret i sig selv? Måske kan du bruge en anden kolonne fra tabellen og sortere dem i overensstemmelse hermed. Forudsat at disse genereres i stigende rækkefølge, ville en kronologisk rækkefølge med fakturaer med den hyppigste, der genereres øverst, give mening, nej? Jeg er ikke sikker på, hvad rullemenuen faktisk er til, eller hvordan kan brugeren drage fordel af den slags. Hvis du kunne oplyse os mere om brugen af marken, ville det være meget mere nyttigt!
  • Det ‘ er op til brugeren. De kan se disse data via rapportering, via en regnskabsskærm, der lader dem kontrollere saldi i forhold til Net 30 (se alle fakturaer fra en leverandør) osv. Brugeren vælger, hvordan de vil sortere skærmen eller rapporten. Dato er en mulighed. Men det samme er fakturanummer. Disse genereres ikke af min ansøgning. Du bestiller forsyninger, dele osv. Fra leverandører. Den specifikke leverandør sparker et fakturanummer tilbage til dig. Ligesom hvis du bestilte fra fem onlinebutikker og fik fem ordrenumre. Nogle er numeriske, andre ikke.
  • Du skal konvertere disse tal til et numerisk format. Brug kun denne til at sortere de alfanumeriske værdier. De konverterede numre behøver ikke at blive vist til brugeren for at forårsage mere forvirring. Jeg vil dog stærkt anbefale dig at have en anden kolonne for eksempel – Dato som supplement til alfanumeriske tal. Da sortering af alfanumeriske numre vil være lidt forvirrende, vil en anden kolonne, der hjælper brugeren med at finde ud af den relevante dato eller noget andet, hjælpe meget.

Svar

Fra og med Windows 7 ændrede Microsoft deres standardmetode til at sortere mapper efter filnavn for at bruge “numerisk” sortering. (Noget info her )

Selvom jeg ikke kunne finde en specifikation af dens adfærd, lykkedes det mig at reverse engineer det. Denne algoritme skulle sammenlign to alfanumeriske strenge og bestem hvilken der kommer først.

  • Del hvert filnavn i alfabetiske og numeriske dele; dvs. navnet text123moretext456 bliver det liste {"text", "123", "moretext", "456"}

  • For hver del i de to splitnavne skal du udføre følgende sammenligning:

    • Hvis begge dele er strengt numeriske, skal du sammenligne dem som tal
      • Hvis tallene er de samme, skal du sammenligne dem som strenge
      • Hvis strengene er ens, skal du gå videre til næste del
    • Hvis begge dele er strengt bogstaver, skal du sammenligne dem som strenge
      • Hvis de “er de samme, skal du gå videre til næste del
  • Hvis du løber tør for dele, kommer navnet med færrest dele f første

Du ender med en ordre som følger:

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

Kommentarer

  • Dette var præcis hvad jeg ledte efter, og den resulterende sorteringsrækkefølge giver mening. Tak!

Svar

Dette spørgsmål (og specielt @Harrison Paines svar) havde hjulpet mig med mit projekt, og jeg vil give [javascript] implementeringen af hans svar til fremtidig reference.Her er sorteringen 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; }; 

Og her er hvordan man bruger det:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *