Řekněme, že zobrazuji data uživateli v mřížce, sestavě, rozevíracím seznamu atd. Dotyčná data obsahují pole s názvem Číslo faktury . Toto pole obsahuje pouze číslice 2/3 času, ale další 1/3 času je směsí alfanumeriky.

Z tohoto důvodu by jakýkoli třídicí algoritmus řadil alfanumericky místo numericky . Z tohoto důvodu by 1000 přišlo mnohem dříve než 99. Protože je seřazena první číslice – ne celá hodnota. S jinými položkami, jako je 000333, nebude zacházeno jako s „333“ a zobrazí se před 222.

Existuje zde nějaký standard? Měl bych se pokoušet převést všechny hodnoty na číselnou hodnotu a seřadit je jinak? Jak by se dali zase dohromady? Nebo je alfanumerické řazení správným způsobem?

Komentáře

  • Máte-li možnost říci, použijte první řetězec ke zkrácení prvních tří číslice, které mají abecedy a třídí se pouze na základě posledních tří číslic, ve vašem případě řekněme ABC333 a 000222 – toto můžete implementovat. Jistě, při zobrazování by to přišlo v pořadí 000222 a potom ABC333. Vizuálně by však bylo trochu matoucí vidět nuly proti několika číslicím a abecedy proti ostatním. Co navrhují abecedy?
  • Různé délky, takže žádný podřetězec. Myslím, že " 10 " přijít před " 9 " (ve skutečnosti FAR před 9) by bylo matoucí pro uživatele, kteří ' často nepoužívají alfanumeriku. Na druhou stranu čistou směs těchto položek ' t nelze třídit žádným pěkným způsobem, který vidím.
  • Pokud se jedná o faktury, můžete je seřadit podle data, nebo je výslovně potřeba seřadit podle čísla faktury samotné? Možná byste mohli použít jiný sloupec ze stolu a podle toho je roztřídit. Za předpokladu, že jsou generovány ve vzestupném pořadí, by dávalo smysl chronologické pořadí faktur s nejčastějším generovaným nahoře, ne? Nejsem si jistý, k čemu vlastně slouží rozbalovací nabídka nebo jak může mít uživatel prospěch z tohoto druhu. Pokud byste nám mohli osvětlit využití pole, bylo by to mnohem užitečnější!
  • Je to ' na uživateli. Mohou si tato data prohlížet prostřednictvím reportů, přes účetní obrazovku, která jim umožňuje kontrolovat zůstatky oproti Net 30 (viz všechny faktury od jednoho dodavatele) atd. Uživatel si zvolí, jak chce, aby byla obrazovka nebo report tříděny. Datum je možnost. Ale stejně tak číslo faktury. Ty nejsou generovány mojí aplikací. Objednáváte spotřební materiál, náhradní díly atd. Od prodejců. Tento konkrétní prodejce vám zašle zpět číslo faktury. Jako kdyby jste si objednali z pěti online obchodů a dostali jste pět objednacích čísel. Některé jsou číselné, jiné nikoli.
  • Tato čísla byste měli převést do číselného formátu. Použijte pouze pro třídění alfanumerických hodnot. Převáděná čísla nemusí být uživateli zobrazována, aby nedošlo k většímu zmatku. Velmi bych vám ale doporučil mít například další sloupec – Date, který doplní alfanumerické číslice. Protože třídění alfanumerických znaků bude trochu matoucí, hodně by pomohl další sloupec, který uživateli pomůže zjistit příslušné datum, nebo něco jiného.

Odpovědět

Počínaje Windows 7 změnila společnost Microsoft výchozí metodu třídění adresářů podle názvu souboru tak, aby používala „číselné“ třídění. (Některé informace zde )

I když jsem nemohl najít specifikaci jeho chování, podařilo se mi jej zpětně analyzovat. Tento algoritmus by měl porovnejte dva alfanumerické řetězce a určete, který z nich bude první.

  • Rozdělte každý název souboru na abecední a numerickou část; tj. název text123moretext456 se stane seznam {"text", "123", "moretext", "456"}

  • U každé části ve dvou rozdělených názvech proveďte následující srovnání:

    • Pokud jsou obě části přísně číselné, porovnejte jako čísla
      • Pokud jsou čísla stejná, porovnejte je jako řetězce
      • Pokud jsou řetězce stejné, přejděte k další části
    • Pokud jsou obě části přísně písmena, porovnejte je jako řetězce
      • Pokud jsou stejné, přejděte k další části
  • Pokud vám dojdou části, název s nejmenším počtem částí bude f irst

Nakonec skončíte s objednávkou, jako je tato:

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

Komentáře

  • To je přesně to, co jsem hledal, a výsledné pořadí řazení má smysl. Děkuji!

Odpověď

Tato otázka (a zejména odpověď @Harrison Paine) mi pomohla v můj projekt a já chci poskytnout [javascript] implementaci jeho odpovědi pro budoucí použití.Tady je řazení 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 tady je způsob použití:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *