Sort

Sortiert den Inhalt einer Variable in alphabetischer, numerischer oder zufälliger Reihenfolge (entfernt optional Duplikate).

SortierteZkette := Sort(Zkette , Optionen, Rückruf)

Parameter

Zkette

Typ: Zeichenkette

Eine Zeichenkette, die sortiert werden soll.

Optionen

Typ: Zeichenkette

Wenn leer oder weggelassen, wird Zkette in aufsteigender alphabetischer Reihenfolge sortiert (Groß-/Kleinschreibung-sensitiv), wobei ein Zeilenvorschub (`n) als Trennzeichen verwendet wird. Andernfalls geben Sie eine Zeichenkette an, die aus einer oder mehreren der unten aufgeführten Optionen besteht (in beliebiger Reihenfolge, optional durch Leerzeichen getrennt):

Rückruf

Typ: Funktionsobjekt

Wenn weggelassen, erfolgt keine benutzerdefinierte Sortierung. Andernfalls geben Sie die aufzurufende Funktion an, die zwei beliebige Elemente in der Liste vergleicht.

Die Rückruffunktion akzeptiert drei Parameter und kann wie folgt definiert werden:

MeinRückruf(Erstes, Zweites, Offset) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Das erste Element.
  2. Das zweite Element.
  3. Der Offset (in Zeichen) des zweiten Elements relativ zum ersten Element in der ursprünglichen/unsortierten Liste (siehe Beispiele).

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden, aber dann muss als letzter Parameter ein Sternchen angegeben werden, z.B. MeinRückruf(Param1, *).

Wenn die Rückruffunktion den ersten Parameter für größer als den zweiten hält, muss sie einen positiven Integer zurückgeben. Wenn die Rückruffunktion beide Parameter als gleich betrachtet, muss sie 0, "" oder nichts zurückgeben. Andernfalls muss sie einen negativen Integer zurückgeben. Wenn der Rückgabewert einen Dezimalpunkt enthält, wird dieser Teil ignoriert (d.h. 0.8 ist dasselbe wie 0).

Die Rückruffunktion verwendet die gleichen globalen (oder threadspezifischen) Einstellungen wie die Sort-Funktion, die sie aufgerufen hat.

Hinweis: Alle Optionen außer D, Z und U werden ignoriert, wenn Rückruf angegeben ist (allerdings haben N, C und CL weiterhin Einfluss darauf, wie Duplikate erkannt werden).

Rückgabewert

Typ: Zeichenkette

Diese Funktion gibt die sortierte Version der angegebenen Zeichenkette zurück.

Optionen

C, C1 oder COn: Groß-/Kleinschreibung-sensitive Sortierung (wird ignoriert, wenn die N-Option vorhanden ist).

C0 oder COff: Nicht-Groß-/Kleinschreibung-sensitive Sortierung. Die Großbuchstaben A bis Z und die entsprechenden Kleinbuchstaben werden bei der Sortierung als identisch betrachtet. Dies ist der Standardmodus, wenn keine der anderen Optionen für die Groß-/Kleinschreibung verwendet wird.

CL oder CLocale: Nicht-Groß-/Kleinschreibung-sensitive Sortierung gemäß den aktuellen Sprach- und Regionseinstellungen des Benutzers. Zum Beispiel behandeln die meisten englischen und westeuropäischen Sprach- und Regionseinstellungen die Großbuchstaben A bis Z, einschließlich ANSI-Großbuchstaben wie Ä und Ü, und die entsprechenden Kleinbuchstaben als identisch. Diese Methode verwendet auch eine "Wortsortierung", die Bindestriche und Apostrophe so behandelt, dass Wörter wie "coop" und "co-op" zusammenbleiben. Je nach Inhalt der zu sortierenden Elemente ist die Performanz 1- bis 8-mal schlechter als die Standardmethode der Nichtsensitivität.

CLogical: Wie CLocale, außer dass Ziffern in den Zeichenketten als numerischer Inhalt behandelt werden, nicht als Text. Zum Beispiel ist "A2" in diesem Fall kleiner als "A10". Wenn sich jedoch zwei Zahlen nur durch das Vorhandensein einer Null am Anfang unterscheiden, wird die Zeichenkette mit einer Null am Anfang möglicherweise so behandelt, als wäre sie kleiner als die andere Zeichenkette. Das genaue Verhalten kann je nach Systemversion variieren.

Dx: Geben Sie für x ein Trennzeichen an, das den Anfang und das Ende pro Element bestimmt. Das Trennzeichen ist immer Groß-/Kleinschreibung-sensitiv. Wenn diese Option nicht verwendet wird, ist x standardmäßig ein Zeilenvorschub (`n). In den meisten Fällen funktioniert das auch, wenn Zeilen mit einem Wagenrücklauf-Zeilenvorschub-Paar (`r`n) enden, allerdings wird der Wagenrücklauf (`r) in die Vergleiche einbezogen, was Einfluss auf die Sortierreihenfolge hat. Zum Beispiel wird "B`r`nA" wie erwartet sortiert, aber "A`r`nA`t`r`nB" platziert A`t`r vor A`r.

N: Numerische Sortierung. Jedes Element wird als Zahl statt als Zeichenkette vermutet (wenn z.B. diese Option nicht verwendet wird, hat dies zur Folge, dass die Zeichenkette 233 wegen der alphabetischen Anordnung kleiner ist als Zeichenkette 40). Sowohl dezimale als auch hexadezimale Zeichenketten (z.B. 0xF1) werden als numerisch betrachtet. Zeichenketten, die nicht mit einer Zahl beginnen, werden beim Sortieren als 0 betrachtet. Zahlen werden als 64-Bit-Floating-Point-Werte behandelt, d.h. der Nachkommabereich jeder Zahl (falls vorhanden) wird berücksichtigt.

Pn: Sortiert Elemente gemäß der Zeichenposition n (verwenden Sie keine Hexadezimalzahlen für n). Wenn diese Option nicht verwendet wird, ist n standardmäßig 1 (die Position des ersten Zeichens). Die Sortierung vergleicht jede Zeichenkette mit den anderen, beginnend beim ihrem n-ten Zeichen. Wenn n größer als die Länge der Zeichenkette ist, wird die Zeichenkette beim Sortieren als leer betrachtet. Wenn diese Option mit der N-Option (numerische Sortierung) verwendet wird, wird die Zeichenposition der Zeichenkette verwendet, die nicht notwendigerweise mit der Ziffernposition der Zahl übereinstimmt.

R: Sortiert in umgekehrter Reihenfolge (alphabetisch oder numerisch, abhängig von den anderen Optionen).

Random: Sortiert in zufälliger Reihenfolge. Diese Option bewirkt, dass alle anderen Optionen außer D, Z und U ignoriert werden (allerdings haben N, C und CL weiterhin Einfluss darauf, wie Duplikate erkannt werden). Beispiele:

MeineVar := Sort(MeineVar, "Random")
MeineVar := Sort(MeineVar, "Random Z D|")

U: Entfernt doppelte Elemente aus der Liste, um jedes Element einzigartig zu machen. Wenn die C-Option aktiv ist, muss die Groß-/Kleinschreibung der Elemente übereinstimmen, damit sie als identisch betrachtet werden. Wenn die N-Option aktiv ist, wird ein Element wie z.B. 2 als Duplikat von 2.0 betrachtet. Wenn die P- oder \-Option aktiv ist, muss das gesamte Element ein Duplikat sein, nicht nur die Teilzeichenkette, die für die Sortierung verwendet wird. Wenn die Random-Option oder benutzerdefinierte Sortierung aktiv ist, werden Duplikate nur entfernt, wenn sie nach der Sortierung direkt aneinander angrenzen. Wenn z.B. "A|B|A" zufällig sortiert wird, kann das Ergebnis entweder ein oder zwei A enthalten.

Z: Um diese Option zu verstehen, nehmen wir als Beispiel eine Variable, die "ROT`nGRÜN`nBLAU`n" enthält. Wenn die Z-Option nicht verwendet wird, wird der letzte Zeilenvorschub (`n) als Teil des letzten Elements betrachtet, folglich sind es nur 3 Elemente. Wenn aber Z verwendet wird, wird das letzte `n (falls vorhanden) als Trennzeichen betrachtet, folglich sind es 4 Elemente und das letzte Element ist leer.

\: Sortiert Elemente gemäß der Teilzeichenkette hinter dem letzten umgekehrten Schrägstrich. Wenn das Element keinen umgekehrten Schrägstrich hat, wird das gesamte Element als Teilzeichenkette betrachtet. Diese Option ist nützlich, um Dateinamen unabhängig von ihrem Pfad zu sortieren, wie im folgenden Beispiel, wo die Zeile AAA.txt oberhalb der Zeile BBB.txt eingeordnet wurde, da ihre Verzeichnisse bei der Sortierung ignoriert wurden:

C:\BBB\AAA.txt
C:\AAA\BBB.txt

Hinweis: Die Optionen N und P werden ignoriert, wenn die \-Option vorhanden ist.

Bemerkungen

Diese Funktion wird normalerweise verwendet, um eine Variable zu sortieren, die eine Liste von Zeilen enthält, wobei jede Zeile mit einem Zeilenvorschubzeichen (`n) endet. Um eine Liste von Zeilen in eine Variable zu bekommen, kann z.B. FileRead verwendet werden, das den gesamten Inhalt einer Datei lädt.

Wenn eine große Variable sortiert wurde und ihr Inhalt später nicht mehr benötigt wird, kann sie leer gemacht werden, um ihr Speicher freizugeben, z.B. MeineVar := "".

FileRead, dateilesende Schleife, parsende Schleife, StrSplit, CallbackCreate, A_Clipboard

Beispiele

Sortiert eine kommagetrennte Liste von Zahlen.

MeineVar := "5,3,7,9,1,13,999,-4"
MeineVar := Sort(MeineVar, "N D,")  ; Numerisch sortieren und Komma als Trennzeichen verwenden.
MsgBox MeineVar   ; Das Ergebnis ist -4,1,3,5,7,9,13,999

Sortiert den Inhalt einer Datei.

Inhalt := FileRead("C:\Adressliste.txt")
FileDelete "C:\Adressliste (alphabetisch).txt"
FileAppend Sort(Inhalt), "C:\Adressliste (alphabetisch).txt"
Inhalt := ""  ; Speicher freigeben.

Erstellt einen Hotkey, der gedrückt werden kann, um Dateien in einem Explorer-Fenster zu kopieren, ihre Dateinamen zu sortieren und die sortierte Liste in die Zwischenablage einzufügen.

#c:: ; WIN+C
{
    A_Clipboard := "" ; Muss leer sein, damit die Erkennung funktioniert.
    Send "^c"
    if !ClipWait(2)
        return
    MsgBox "Bereit zum Einfügen:`n" Sort(A_Clipboard)
}

Zeigt die benutzerdefinierte Sortierung mit einer Rückruffunktion.

MeineVar := "Dies`nist`neine`nBeispiel`nZeichenkette,`ndie`nsortiert`nwerden`nsoll"
MsgBox Sort(MeineVar,, SortierenNachLänge)
SortierenNachLänge(a1, a2, *)
{
    a1 := StrLen(a1), a2 := StrLen(a2)
    return a1 > a2 ? 1 : a1 < a2 ? -1 : 0  ; Sortiert nach den oben ermittelten Längen.
}

MeineVar := "5,3,7,9,1,13,999,-4"
MsgBox Sort(MeineVar, "D,", SortierenNachInteger)
SortierenNachInteger(a1, a2, *)
{
    return a1 - a2  ; Sortiert in aufsteigender numerischer Reihenfolge. Diese Methode funktioniert nur, wenn die Differenz einen vorzeichenfähigen 64-Bit-Integer nicht überschreiten kann.
}

MeineVar := "1,2,3,4"
MsgBox Sort(MeineVar, "D,", UmgekehrteRichtung)  ; Kehrt die Liste um, so dass sie 4,3,2,1 enthält.
UmgekehrteRichtung(a1, a2, offset)
{
    return offset  ; Offset ist positiv, wenn in der originalen Liste a2 nach a1 kommt, andernfalls negativ.
}

MeineVar := "a bbb cc"
; Sortiert nach Länge in aufsteigender Reihenfolge; verwendet eine Fat-Arrow-Funktion:
MsgBox Sort(MeineVar, "D ", (a,b,*) => StrLen(a) - StrLen(b))