Ich möchte ein Array von Strings (in Javascript) so sortieren, dass Gruppen von Ziffern innerhalb der Strings als ganze Zahlen und nicht als Strings verglichen werden. Ich mache mir keine Sorgen über signierte oder Gleitkommazahlen.
zum Beispiel sollte das Ergebnis ["a1b3","a9b2","a10b2","a10b11"]
nicht ["a1b3","a10b11","a10b2","a9b2"]
Der einfachste Weg, dies zu tun, scheint zu sein, jeden String an Grenzen um Gruppen von Ziffern aufzuteilen. Gibt es ein Muster, das ich String.split übergeben kann, um auf Zeichengrenzen zu teilen, ohne irgendwelche Zeichen zu entfernen?
"abc11def22ghi".split(/?/) = ["abc","11","def","22","ghi"];
Oder gibt es eine andere Möglichkeit, Strings zu vergleichen, ohne sie aufzuteilen, indem Sie beispielsweise alle Zifferngruppen mit führenden Nullen auffüllen, so dass sie die gleiche Länge haben?
"aa1bb" => "aa00000001bb", "aa10bb" => "aa00000010bb"
Ich arbeite mit beliebigen Strings, nicht mit Strings, die eine bestimmte Anordnung von Zifferngruppen haben.
Bearbeiten:
Ich mag den /(\d+)/
one Liner von Gaby, um das Array zu teilen. Wie rückwärtskompatibel ist das?
Die Lösungen, die die Zeichenketten einmal so analysieren, dass die Originale wiederhergestellt werden können, sind wesentlich effizienter als diese Vergleichsfunktion. Keine der Antworten behandelt einige Strings, die mit Ziffern anfangen, andere nicht, aber das wäre leicht genug, um Abhilfe zu schaffen und war in der ursprünglichen Frage nicht explizit.
%Vor% Ergebnis: "!!,9,9.5,10,a3,a3b,a3b3,a3b20,a3b100,a20,a100,~~"
Wenn Sie davon ausgehen, dass Sie nur eine numerische Sortierung nach den Ziffern in jedem Array-Eintrag durchführen möchten (ignorieren Sie die Nicht-Ziffern), können Sie Folgendes verwenden:
%Vor%Es verwendet eine benutzerdefinierte Sortierfunktion, die die Ziffern entfernt und bei jedem Vergleich in eine Zahl umwandelt. Sie können sehen, dass es hier funktioniert: Ссылка .
Wenn dies nicht das ist, was Sie wollen, dann erklären Sie bitte, da Ihre Frage nicht sehr klar ist, wo die Art eigentlich funktionieren sollte.
Hier ist eine vollständigere Lösung , die nach Buchstaben und Zahlen in den Strings sortiert
%Vor%Das Sortieren erfolgt von links nach rechts, sofern Sie keinen benutzerdefinierten Algorithmus erstellen. Buchstaben oder Ziffern werden zuerst Ziffern und dann Buchstaben verglichen.
Was Sie jedoch nach Ihrem eigenen Beispiel (a1, a9, a10) erreichen wollen, wird nicht immer passieren. Das würde erfordern, dass Sie die Daten vor der Hand kennen und die Zeichenfolge auf jede mögliche Weise aufteilen, bevor Sie die Sortierung anwenden.
Eine letzte Alternative wäre:
a) brechen Sie jeden einzelnen String von links nach rechts, wenn Sie von einem Buchstaben zum anderen wechseln und umgekehrt; &Ampere; b) Beginnen Sie dann die Sortierung dieser Gruppen von RECHTS NACH LINKS. Das wird ein sehr anspruchsvoller Algorithmus sein. Kann gemacht werden!
Wenn Sie schließlich der GENERATOR des ursprünglichen "Textes" sind, sollten Sie NORMALISIERUNG der Ausgabe in Erwägung ziehen, wobei a1 a9 a10 als a01 a09 a10 ausgegeben werden könnte. Auf diese Weise können Sie die endgültige Version des Algorithmus vollständig ausfüllen.
Viel Glück!
Ich brauchte einen Weg, um eine gemischte Zeichenkette zu nehmen und eine Zeichenkette zu erstellen, die anderswo sortiert werden könnte, so dass Zahlen numerisch und Buchstaben alphabetisch sortiert sind. Basierend auf den obigen Antworten habe ich Folgendes erstellt, das alle Zahlen auf eine Weise ausgibt, die ich verstehen kann, egal wo sie in der Zeichenfolge vorkommen.
%Vor%Tags und Links javascript regex split sorting natural-sort