gemischt wird? Angenommen, ich zeige einem Benutzer Daten in einem Raster, Bericht, Dropdown-Feld usw. an. Die fraglichen Daten enthalten ein Feld mit dem Namen Rechnungsnummer . Dieses Feld enthält nur 2/3 der Zeit Zahlen, aber das andere 1/3 der Zeit ist eine Mischung aus alphanumerischen Zahlen.

Aus diesem Grund würde jeder Sortieralgorithmus alphanumerisch statt numerisch sortieren . Aus diesem Grund würde 1000 weit vor 99 liegen. Weil die erste Ziffer sortiert ist – nicht der gesamte Wert. Andere Elemente wie 000333 werden nicht als „333“ behandelt und erscheinen vor 222.

Gibt es hier einen Standard? Sollte ich versuchen, alle Werte in einen numerischen Wert umzuwandeln und diese unterschiedlich zu sortieren? Wie würden sie wieder zusammen integriert werden? Oder ist die alphanumerische Sortierung der richtige Weg?

Kommentare

  • Wenn Sie die Möglichkeit haben zu sagen, verwenden Sie Teilzeichenfolgen, um die ersten drei zu kürzen Ziffern, deren Buchstaben und Sortierung ausschließlich auf den letzten drei Ziffern basieren, sagen Sie in Ihrem Fall ABC333 und 000222 – Sie könnten dies implementieren. Sicher, während der Anzeige würde es in der Reihenfolge 000222 und dann ABC333 kommen. Visuell wäre es jedoch etwas verwirrend, Nullen gegen wenige Ziffern und Alphabete gegen andere zu sehen. Was schlagen die Alphabete vor?
  • Unterschiedliche Längen, also kein SubString. Ich denke, “ 10 “ kommt vor “ 9 “ (tatsächlich weit vor 9) wäre für Benutzer verwirrend, die ‚ nicht häufig alphanumerische Zahlen verwenden. Auf der anderen Seite kann eine reine Mischung davon ‚ nicht so gut sortiert werden, wie ich es sehen kann.
  • Wenn es sich um Rechnungen handelt, können Sie sie sortieren nach Datum oder muss es explizit nach der Rechnungsnummer selbst sortiert werden? Vielleicht könnten Sie eine andere Spalte aus der Tabelle verwenden und sie entsprechend sortieren. Unter der Annahme, dass diese in aufsteigender Reihenfolge generiert werden, wäre eine chronologische Reihenfolge der Rechnungen sinnvoll, wobei die häufigste oben generiert wird. Ich bin mir nicht sicher, wofür das Dropdown-Menü eigentlich gedacht ist oder wie der Benutzer von der Sortierung profitieren kann. Wenn Sie uns mehr über die Verwendung des Feldes aufklären könnten, wäre dies viel hilfreicher!
  • Es liegt beim Benutzer ‚. Sie können diese Daten über die Berichterstellung, über einen Buchhaltungsbildschirm anzeigen, auf dem sie Salden mit Net 30 vergleichen können (siehe alle Rechnungen eines Lieferanten) usw. Der Benutzer wählt aus, wie der Bildschirm oder Bericht sortiert werden soll. Datum ist eine Option. Aber auch die Rechnungsnummer. Diese werden von meiner Bewerbung nicht generiert. Sie bestellen Verbrauchsmaterialien, Teile usw. bei Lieferanten. Dieser bestimmte Anbieter gibt Ihnen eine Rechnungsnummer zurück. Zum Beispiel, wenn Sie in fünf Online-Shops bestellt und fünf Bestellnummern erhalten haben. Einige sind numerisch, andere nicht.
  • Sie sollten diese Zahlen in ein numerisches Format konvertieren. Verwenden Sie diese Option nur, um die alphanumerischen Werte zu sortieren. Die konvertierten Zahlen müssen dem Benutzer nicht angezeigt werden, um mehr Verwirrung zu stiften. Ich würde Ihnen jedoch wärmstens empfehlen, zum Beispiel eine andere Spalte zu verwenden – Datum als Ergänzung zu den Alphanumeralen. Da das Sortieren von Alphanumeralen etwas verwirrend ist, hilft eine weitere Spalte, die dem Benutzer hilft, das relevante Datum oder etwas anderes herauszufinden, sehr.

Antwort

Ab Windows 7 hat Microsoft die Standardmethode zum Sortieren von Verzeichnissen nach Dateinamen geändert, um die „numerische“ Sortierung zu verwenden. (Einige Informationen hier )

Obwohl ich keine Spezifikation seines Verhaltens finden konnte, konnte ich es zurückentwickeln. Dieser Algorithmus sollte Vergleichen Sie zwei alphanumerische Zeichenfolgen und bestimmen Sie, welche zuerst kommt.

  • Teilen Sie jeden Dateinamen in alphabetische und numerische Teile auf, dh der Name text123moretext456 wird zum Liste {"text", "123", "moretext", "456"}

  • Führen Sie für jeden Teil in den beiden geteilten Namen den folgenden Vergleich durch:

    • Wenn beide Teile streng numerisch sind, vergleichen Sie sie als Zahlen
      • Wenn die Zahlen gleich sind, vergleichen Sie sie als Zeichenfolgen
      • Wenn die Zeichenfolgen identisch sind, fahren Sie mit dem nächsten Teil fort
    • Wenn beide Teile ausschließlich Buchstaben sind, vergleichen Sie sie als Zeichenfolgen.
      • Wenn sie gleich sind, fahren Sie mit dem nächsten Teil fort.
  • Wenn Ihnen die Teile ausgehen, lautet der Name mit den wenigsten Teilen f zuerst
  • Sie erhalten eine Bestellung wie die folgende:

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

    Kommentare

    • Genau das habe ich gesucht, und die resultierende Sortierreihenfolge ist sinnvoll. Vielen Dank!

    Antwort

    Diese Frage (und insbesondere die Antwort von @Harrison Paine) hatte mir weitergeholfen Mein Projekt und ich möchten die [Javascript] -Implementierung seiner Antwort zur späteren Bezugnahme bereitstellen.Hier ist die Sortierung 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; }; 

    Und hier ist die Verwendung:

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

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.