wie man Zeichenketten in Javascript numerisch sortiert

8

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"]

sein

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,~~"

    
drawnonward 12.11.2011, 20:11
quelle

6 Antworten

10

Ich denke, das macht was du willst

%Vor%     
Alan Draper 12.11.2011, 21:15
quelle
5

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.

    
jfriend00 12.11.2011 20:46
quelle
4

Verwenden Sie diese Vergleichsfunktion zum Sortieren ..

%Vor%

Syntax

%Vor%

Demo bei Ссылка

    
Gaby aka G. Petrioli 12.11.2011 21:24
quelle
1

Hier ist eine vollständigere Lösung , die nach Buchstaben und Zahlen in den Strings sortiert

%Vor%     
Flambino 12.11.2011 20:50
quelle
0

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!

    
zequinha-bsb 12.11.2011 20:54
quelle
0

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%     
Peter Cooper 08.02.2018 05:09
quelle