Tegyük fel, hogy adatokat adok meg egy felhasználónak egy rácsban, jelentésben, legördülő mezőben stb. A szóban forgó adatok tartalmazzák a Számla száma nevű mezőt. Ez a mező csak az idő 2/3-át tartalmazza, de az idő másik 1/3-a alfa-számok keveréke.

Emiatt bármely rendezési algoritmus az alfát numerikusan, nem pedig numerikusan rendezi . Emiatt 1000 messze eléri a 99-et. Mivel az első számjegy rendezve van – nem a teljes érték. Más elemeket, például a 000333-at, nem kezelnénk “333” -ként, és 222 előtt jelennének meg.

Van itt valami szabvány? Meg kell próbálnom az összes értéket számértékre konvertálni, és másképp rendezni? Hogyan integrálódnának újra össze? Vagy az alfa-numerikus rendezés a helyes út?

Megjegyzések

  • Ha képes megmondani, használjon alszöveget az első három csonkításához. számjegyek, amelyek ábécét tartalmaznak, és kizárólag az utolsó három számjegy alapján válogatnak, esetünkben mondjuk ABC333 és 000222 – ezt megvalósíthatja. Bizony, a megjelenítés közben 000222, majd az ABC333 sorrendben jönne. Viszont vizuálisan kissé zavaró lenne, ha néhány számmal nullákat, másokkal szemben ábécét látunk. Mit javasolnak az ábécék?
  • Változó hosszúságú, így nincs SubString. Szerintem ” 10 ” látása ” 9 (valójában 9 előtt FAR) zavaró lenne azokat a felhasználókat, akik nem ‘ nem használnak gyakran alfa-számokat. Másrészről ezek tiszta elegyét valóban nem lehet ‘ rendezni bármilyen jól látható módon.
  • Ha ezek számlák, rendezheti őket Dátum szerint, vagy kifejezetten a Számla száma szerint kell rendezni? Talán használhatna egy másik oszlopot a táblázatból, és ennek megfelelően rendezheti őket. Ha feltételezzük, hogy ezeket növekvő sorrendben állítják elő, akkor lenne értelme a számlák időrendi sorrendjének, amelynek teteje a leggyakoribb, nem? Nem vagyok biztos abban, hogy valójában mire szolgál a legördülő menü, vagy hogyan profitálhat a felhasználó a rendezésből. Ha többet tudna megvilágítani a mező használatáról, sokkal hasznosabb lenne!
  • Ez a felhasználó ‘ feladata. Megtekinthetik ezeket az adatokat jelentések útján, egy könyvelési képernyőn keresztül, amely lehetővé teszi számukra, hogy ellenőrizzék az egyenlegeket a Net 30-hoz képest (lásd az összes szállító összes számláját) stb. A dátum opció. De így van a számlaszám is. Ezeket nem az én alkalmazásom generálja. Kellékeket, alkatrészeket stb. Rendel az eladóktól. Az adott szállító visszaküldi Önnek a számlaszámot. Mint ha öt online áruházból rendeltél és öt rendelési számot kaptál. Vannak, amelyek numerikusak, mások nem.
  • Ezeket a számokat konvertálnia kell numerikus formátumra. Ezt csak az alfanumerikus értékek rendezéséhez használja. Az átváltott számokat nem kell megmutatni a felhasználónak, hogy nagyobb zavart okozzon. Nagyon ajánlom azonban, hogy legyen például egy másik oszlop – Dátum az Alphanumerals kiegészítésére. Mivel az Alphanumerals rendezése kissé zavaró lesz, egy másik oszlop, amely segít a felhasználónak kitalálni a vonatkozó dátumot, vagy valami más, sokat segítene.

Válasz

A Windows 7-től kezdődően a Microsoft megváltoztatta alapértelmezett módszerét a könyvtárak fájlnév szerinti rendezésére, hogy “numerikus” rendezést használjon. (Néhány információ itt )

Noha nem találtam a viselkedésének specifikációját, mégis sikerült átalakítanom. Ennek az algoritmusnak hasonlítson össze két alfanumerikus karakterláncot, és határozza meg, hogy melyik következik először.

  • Minden fájlnév betűrendes és numerikus részekre oszlik, azaz a text123moretext456 név lesz listázza a {"text", "123", "moretext", "456"}

  • A két osztott név minden részéhez hajtsa végre a következő összehasonlítást:

    • Ha mindkét rész szigorúan numerikus, hasonlítsa össze számként
      • Ha a számok megegyeznek, hasonlítsa össze őket karakterláncként
      • Ha a karakterláncok megegyeznek, lépjen a következő részre
    • Ha mindkét rész szigorúan betűkből áll, hasonlítsa össze őket karaktersorozatokként
      • Ha azonosak, lépjen a következő részre
  • Ha elfogynak az alkatrészei, akkor a legkevesebb részt tartalmazó név f irst

A következő sorrendet kapja:

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

Megjegyzések

  • Pontosan ezt kerestem, és az így kapott rendezési sorrendnek van értelme. Köszönöm!

Válasz

Ez a kérdés (és különösképpen @Harrison Paine válasza) segített nekem a projektemet és jövőbeni felhasználásra szeretném megadni a válaszának [javascript] megvalósítását.Itt van a rendezés 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; }; 

És ennek a használata:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük