変数の内容をアルファベット順、数値順、ランダム順に並べます(オプションで重複を削除します)。
SortedString := Sort(String , Options, Callback)
型:文字列
The string to sort.
型:文字列
If blank or omitted, String will be sorted in ascending alphabetical order (case-insensitive), using a linefeed (`n) as separator. それ以外の場合は、以下の「オプション」セクションから1つ以上のオプション文字列を指定する(任意の順序で、間に任意のスペースを入れる)。
型:機能オブジェクト
If omitted, no custom sorting will be performed. そうでない場合は、リスト内の任意の2つの項目を比較する関数を呼び出すように指定する。
コールバックは3つのパラメーターを受け取り、以下のように定義できる:
MyCallback(First, Second, Offset) { ...
パラメータに与える名前は重要ではないが、以下の値が順次割り当てられる:
対応する情報が不要な場合、コールバックのパラメータリストの最後から1つ以上のパラメータを省略することができますが、この場合、MyCallback(Param1, *)
のように、最後のパラメータとしてアスタリスクを指定する必要があります。
2つのパラメータが等しいと判断した場合は、0、""、または何も返さず、そうでない場合は負の整数を返します。返される値に小数点がある場合、その部分は無視されます(つまり0.8は0と同じ)。
コールバックは、それを呼び出したSort関数と同じグローバルな(あるいはスレッド固有の)設定を使用します。
注: Callbackを指定したときは、D、Z、U以外のすべてのオプションは無視されます。ただし、N、C、CLは重複の検出方法にも影響します。
型:文字列
この関数は、指定された文字列をソートして返します。
C、C1またはCOn:大文字小文字を区別してソートします(Nオプションがある場合は無視されます)。
C0またはCOff:大文字小文字を区別しないソート。大文字のA-Zは、小文字のA-Zと同じとみなされます。これは、他の大文字小文字の区別オプションが使われていない場合のデフォルト・モードです。
CLまたはCLocale:現在のユーザーのロケールに基づき、大文字小文字を区別せずにソートします。例えば、ほとんどの英語と西ヨーロッパのロケールでは、A-Zの文字とÄやÜなどのANSI文字が小文字と同じように扱われます。また、この方法では、「coop」と「co-op」のような単語が一緒になるようにハイフンやアポストロフィーを処理する「ワードソート」を使用しています。ソートされる項目の内容にもよるが、デフォルトの不感症の方法よりも1倍から8倍パフォーマンスが悪くなります。
CLogical: CLocaleと似ているが、文字列中の数字はテキストではなく数値の内容とみなされます。例えば、"A2 "は "A10 "よりも小さいとみなされる。しかし、2つの数値が先頭のゼロの有無によってのみ異なる場合、先頭のゼロがある文字列は、もう一方の文字列よりも小さいとみなされることがある。正確な動作はOSのバージョンによって異なる場合があります。
Dx:区切り文字としてxを指定し、各項目の始まりと終わりを決定する。区切り文字は常に大文字と小文字を区別します。このオプションがない場合、xのデフォルトは改行(`n)です。ほとんどの場合、行末がCR+LF(`r`n)であっても機能するが、キャリッジリターン(`r)は比較に含まれるため、ソートの順番に影響します。例えば、"B`r`nA"
は期待通りにソートされるが、"A`r`nA`t`r`nB"
はA`t`r
を A`r
の前に置く。
N:数値ソート。各項目は文字列ではなく数値であるとみなされます(たとえば、このオプションがない場合、アルファベット順のため、文字列233は文字列40より小さいとみなされます)。10進数および16進数の文字列(例えば0xF1)はいずれも数値とみなされます。数字で始まらない文字列は、ソートの目的上ゼロとみなされます。数値は64ビットの浮動小数点値として扱われ、各数値の10進数部分(もしあれば)が考慮されます。
Pn:文字位置nに基づいて項目をソートする(nには 16 進数を使用しない)。このオプションがない場合、nのデフォルトは1で、これは最初の文字の位置である。ソートは各文字列をn文字目から他の文字列と比較する。nが文字列の長さより大きい場合、その文字列はソートの目的のために空白であるとみなされる。オプションN(数値ソート)と併用する場合、文字列の文字位置が使われるが、これは必ずしも数値の桁位置と同じではない。
R:逆順に並べ替える(アルファベット順か数字順かは他のオプションによる)。
Random:ランダムな順序でソートする。このオプションは、D、Z、U以外のすべてのオプションを無視する(ただし、N、C、CLは重複の検出方法に影響を与える)。例:
MyVar := Sort(MyVar, "Random") MyVar := Sort(MyVar, "Random Z D|")
U:リストから重複する項目を削除し、すべての項目が一意になるようにします。Cオプションが有効な場合、同一とみなされるためには、項目の大文字と小文字が一致しなければならない。Nオプションが有効な場合、2のような項目は2.0と重複しているとみなされる。Pオプションまたは(バックスラッシュ)オプションのいずれかが有効な場合、ソートに使用される部分文字列だけでなく、項目全体が重複していなければなりません。ランダム・オプションまたはカスタム・ソートが有効な場合、重複は、ソートの結果、隣接して表示された場合にのみ削除される。例えば、"A|B|A"
がランダムにソートされた場合、結果には1つまたは2つのAが含まれる可能性があります。
Z:このオプションを理解するために、"RED`nGREEN`nBLUE`n"
を含む変数を考えてみよう。Zオプションがない場合、最後の改行(`n)は最後の項目の一部とみなされるため、項目は3つしかありません。しかし、Zを指定することで、最後の`n(存在する場合)はリストの最後にある空白の項目を区切るとみなされるため、4つの項目(最後の項目は空白)が存在することになります。
\:各項目の最後のバックスラッシュに続く部分文字列に基づいて項目をソートします。項目にバックスラッシュがない場合は、項目全体が部分文字列として使われる。このオプションは、以下の例のように、(パスを除いた)素のファイル名をソートするのに便利です。この例では、AAA.txt行がBBB.txt行の上にソートされるが、これはソートの目的上、これらのディレクトリが無視されるからです:
C:\BBB\AAA.txt C:\AAA\BBB.txt
注:NとPのオプションは、N(バックスラッシュ)オプションがある場合は無視されます。
この関数は通常、行末が改行文字(`n)で終わる行のリストを含む変数をソートするために使われる。行のリストを変数に取り込む1つの方法は、FileReadでファイル全体を読み込むことである。
大きな変数がソートされ、後でその内容が不要になった場合、例えばMyVar := ""
のように空白にすることでメモリを解放することができます。
FileRead、ファイル読み込みループ、解析ループ、StrSplit、CallbackCreate、A_Clipboard
MyVar := "5,3,7,9,1,13,999,-4" MyVar := Sort(MyVar, "N D,") ; Sort numerically, use comma as delimiter. MsgBox MyVar ; The result is -4,1,3,5,7,9,13,999
Contents := FileRead("C:\Address List.txt") FileDelete "C:\Address List (alphabetical).txt" FileAppend Sort(Contents), "C:\Address List (alphabetical).txt" Contents := "" ; メモリを解放します。
開いているエクスプローラーウィンドウからファイルをコピーし、ソートされたファイル名をクリップボードに置くホットキーを作成します。
#c:: ; Win+C { A_Clipboard := "" ; Must be blank for detection to work. Send "^c" if !ClipWait(2) return MsgBox "Ready to be pasted:`n" Sort(A_Clipboard) }
コールバック関数によるカスタム・ソートのデモンストレーション。
MyVar := "This`nis`nan`nexample`nstring`nto`nbe`nsorted" MsgBox Sort(MyVar,, LengthSort) LengthSort(a1, a2, *) { a1 := StrLen(a1), a2 := StrLen(a2) return a1 > a2 ? 1 : a1 < a2 ? -1 : 0 ; Sorts according to the lengths determined above. } MyVar := "5,3,7,9,1,13,999,-4" MsgBox Sort(MyVar, "D,", IntegerSort) IntegerSort(a1, a2, *) { return a1 - a2 ; Sorts in ascending numeric order. This method works only if the difference is never so large as to overflow a signed 64-bit integer. } MyVar := "1,2,3,4" MsgBox Sort(MyVar, "D,", ReverseDirection) ; Reverses the list so that it contains 4,3,2,1 ReverseDirection(a1, a2, offset) { return offset ; Offset is positive if a2 came after a1 in the original list; negative otherwise. } MyVar := "a bbb cc" ; Sorts in ascending length order; uses a fat arrow function: MsgBox Sort(MyVar, "D ", (a,b,*) => StrLen(a) - StrLen(b))