Si at jeg viser data til en bruker i et rutenett, rapport, rullegardinboks osv. De aktuelle dataene inneholder et felt som heter Fakturanummer . Dette feltet inneholder bare numerics 2/3 av tiden, men den andre 1/3 av tiden er en blanding av alfanumerikk.
På grunn av dette vil enhver sorteringsalgoritme sortere alfa numerisk i stedet for numerisk . Av denne grunn ville 1000 komme langt før 99. Fordi det første sifferet er sortert på – ikke hele verdien. Andre gjenstander som 000333 vil ikke bli behandlet som «333» og vil dukke opp før 222.
Er det noen standard her? Bør jeg prøve å konvertere alle verdier til en numerisk verdi og sortere disse på en annen måte? Hvordan ville de bli integrert igjen? Eller er alfanumerisk sortering den riktige veien å gå?
Kommentarer
- Hvis du har muligheten til å si, bruk substring for å avkutte de tre første sifre som har alfabeter og sorterer utelukkende basert på de tre siste sifrene, i ditt tilfelle sier ABC333 og 000222 – du kan implementere dette. Jada, mens du viser det, vil det komme i rekkefølgen 000222 og deretter ABC333. Imidlertid ville det visuelt være litt forvirrende å se nuller mot få tall og alfabet mot andre. Hva antyder alfabetene?
- Varierende lengder så ingen SubString. Jeg tror å se " 10 " komme før " 9 " (faktisk FAR før 9) ville være forvirrende for brukere som ikke bruker ' t ofte alfanumeriske tall. På den annen side kan en ren blanding av disse virkelig ' sorteres på noen fin måte jeg kan se.
- Hvis dette er fakturaer, kan du sortere dem etter dato eller er det eksplisitt behov for å sortere i henhold til selve fakturanummeret? Kanskje du kan bruke en annen kolonne fra tabellen og sortere dem deretter. Forutsatt at disse genereres i økende rekkefølge, ville en kronologisk rekkefølge med fakturaer med den hyppigste som genereres øverst, gi mening, nei? Jeg er ikke sikker på hva rullegardinmenyen egentlig er for, eller hvordan kan brukeren dra nytte av typen. Hvis du kunne opplyse oss mer om bruken av feltet, ville det vært mye mer nyttig!
- Det er ' det er opp til brukeren. De kan se disse dataene via rapportering, via en regnskapsskjerm som lar dem sjekke saldoer mot Net 30 (se alle fakturaer fra en leverandør) osv. Brukeren velger hvordan de vil at skjermen eller rapporten skal sorteres. Dato er et alternativ. Men det er også fakturanummer. Disse genereres ikke av søknaden min. Du bestiller rekvisita, deler osv fra leverandører. Den spesifikke leverandøren sparker tilbake et fakturanummer til deg. Som om du bestilte fra fem nettbutikker og fikk fem ordrenumre. Noen er numeriske, andre ikke.
- Du bør konvertere disse tallene til et numerisk format. Bruk dette bare for å sortere de alfanumeriske verdiene. De konverterte tallene trenger ikke vises til brukeren for å forårsake mer forvirring. Jeg vil imidlertid sterkt anbefale deg å ha en annen kolonne for eksempel – Dato for å utfylle alfanumeriske tegn. Siden sortering av alfanumeriske tegn vil være litt forvirrende, vil en annen kolonne som hjelper brukeren med å finne ut den aktuelle datoen eller noe annet hjelpe mye.
Svar
Fra og med Windows 7 endret Microsoft standardmetoden for å sortere kataloger etter filnavn for å bruke «numerisk» sortering. (Noe info her )
Selv om jeg ikke kunne finne en spesifikasjon av oppførselen, klarte jeg å reversere den. Denne algoritmen skulle sammenlign to alfanumeriske strenger og bestem hvilken som kommer først.
-
Del hvert filnavn i alfabetiske og numeriske deler, dvs. navnet
text123moretext456
blir liste {"text"
,"123"
,"moretext"
,"456"
} -
For hver del i de to delte navnene, utfør følgende sammenligning:
- Hvis begge delene er strengt numeriske, sammenlign dem som tall
- Hvis tallene er de samme, sammenlign dem som strenger
- Hvis strengene er de samme, fortsett til neste del
- Hvis begge delene er strengt bokstaver, kan du sammenligne dem som strenger
- Hvis de er like, fortsett til neste del
- Hvis begge delene er strengt numeriske, sammenlign dem som tall
- Hvis du går tom for deler, kommer navnet med færrest deler f irst
Du ender med en bestilling som følger:
2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a
Kommentarer
- Dette var akkurat det jeg lette etter, og den resulterende sorteringsrekkefølgen gir mening. Takk!
Svar
Dette spørsmålet (og spesielt @Harrison Paines svar) hadde hjulpet meg med prosjektet mitt, og jeg vil gi [javascript] implementeringen av svaret hans for fremtidig referanse.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 du bruker den:
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);