Stel dat ik gegevens aan een gebruiker toon in een raster, rapport, vervolgkeuzelijst, enz. De betreffende gegevens bevatten een veld met de naam Factuurnummer . Dit veld bevat slechts 2/3 van de cijfers numeriek, maar de andere 1/3 van de tijd is een combinatie van alfanumerieke tekens.
Daarom zou elk sorteeralgoritme alfanumeriek in plaats van numeriek sorteren . Om deze reden zou 1000 ver voor 99 komen. Omdat het eerste cijfer is gesorteerd – niet de hele waarde. Andere items zoals 000333 zouden niet worden behandeld als “333” en zouden vóór 222 verschijnen.
Is hier een standaard? Moet ik proberen om alle waarden naar een numerieke waarde te converteren en die anders te sorteren? Hoe zouden ze weer bij elkaar geïntegreerd worden? Of is alfanumeriek sorteren de juiste manier om te gaan?
Opmerkingen
- Als je de mogelijkheid hebt om te zeggen, gebruik dan substring om de eerste drie af te kappen cijfers met het alfabet en alleen sorteren op basis van de laatste drie cijfers, in uw geval bijvoorbeeld ABC333 en 000222 – u zou dit kunnen implementeren. Natuurlijk, tijdens het weergeven zou het in de volgorde 000222 en dan ABC333 komen. Visueel zou het echter een beetje verwarrend zijn om nullen tegen enkele cijfers en alfabetten tegen andere te zien. Wat suggereren de alfabetten?
- Variërende lengtes dus geen SubString. Ik denk dat ik ” 10 ” vóór ” 9 (eigenlijk FAR vóór 9) zou verwarrend zijn voor gebruikers die ‘ niet vaak alfanumerieke tekens gebruiken. Aan de andere kant kan een pure mix hiervan echt ‘ niet worden gesorteerd op een mooie manier die ik kan zien.
- Als dit facturen zijn, kun je ze sorteren op datum of moet het expliciet worden gesorteerd op het factuurnummer zelf? Misschien kunt u een andere kolom uit de tabel gebruiken en deze overeenkomstig sorteren. Ervan uitgaande dat deze in oplopende volgorde worden gegenereerd, zou een chronologische volgorde van facturen met de meest voorkomende bovenaan worden gegenereerd, zinvol zijn, niet? Ik weet niet zeker waar de vervolgkeuzelijst eigenlijk voor is of hoe de gebruiker kan profiteren van het soort. Als je ons meer zou kunnen informeren over het gebruik van het veld, zou het veel nuttiger zijn!
- Het is ‘ aan de gebruiker. Ze kunnen deze gegevens raadplegen via rapportering, via een boekhoudscherm waarmee ze de saldi kunnen vergelijken met Net 30 (zie alle facturen van één leverancier), enz. De gebruiker kiest hoe hij het scherm of rapport wil sorteren. Datum is een optie. Maar dat geldt ook voor het factuurnummer. Deze worden niet gegenereerd door mijn applicatie. U bestelt benodigdheden, onderdelen, enz. Bij leveranciers. Die specifieke leverancier geeft u een factuurnummer terug. Alsof je bij vijf online winkels hebt besteld en vijf bestelnummers hebt gekregen. Sommige zijn numeriek, andere niet.
- U moet deze getallen converteren naar een numeriek formaat. Gebruik dit alleen om de alfanumerieke waarden te sorteren. De geconverteerde nummers hoeven niet aan de gebruiker te worden getoond om meer verwarring te veroorzaken. Ik zou u echter sterk aanbevelen om bijvoorbeeld een andere kolom te hebben – Datum als aanvulling op de alfanumerieke tekens. Aangezien het sorteren van alfanumerieke tekens een beetje verwarrend zal zijn, zou een andere kolom om de gebruiker te helpen de relevante datum of iets anders te achterhalen veel helpen.
Antwoord
Beginnend met Windows 7, heeft Microsoft hun standaardmethode voor het sorteren van mappen op bestandsnaam gewijzigd in “numerieke” sortering. (Wat informatie hier )
Hoewel ik geen specificatie van zijn gedrag kon vinden, slaagde ik erin om het reverse-engineeren. Dit algoritme zou vergelijk twee alfanumerieke strings en bepaal welke het eerst komt.
-
Splits elke bestandsnaam op in alfabetische en numerieke delen; dwz de naam
text123moretext456
wordt de lijst {"text"
,"123"
,"moretext"
,"456"
} -
Voer voor elk deel in de twee splitsingsnamen de volgende vergelijking uit:
- Als beide delen strikt numeriek zijn, vergelijk dan ze als getallen
- Als de getallen hetzelfde zijn, vergelijk ze dan als strings
- Als de strings hetzelfde zijn, ga je verder met het volgende deel
- Als beide delen strikt letters zijn, vergelijk ze dan als strings
- Als ze hetzelfde zijn, ga dan verder met het volgende deel
- Als beide delen strikt numeriek zijn, vergelijk dan ze als getallen
- Als je geen onderdelen meer hebt, komt de naam met de minste onderdelen f irst
Je krijgt een bestelling als volgt:
2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a
Reacties
- Dit is precies wat ik zocht, en de resulterende sorteervolgorde is logisch. Bedankt!
Antwoord
Deze vraag (en speciaal het antwoord van @Harrison Paine) had me geholpen mijn project en ik willen de [javascript] -implementatie van zijn antwoord verstrekken voor toekomstig gebruik.Hier is de sortering 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; };
En hier is hoe het te gebruiken:
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);