ASORT¶
Category: 配列操作
書式¶
ASORT(option, array)
引数¶
| Parameter | Description |
|---|---|
| option | ソート動作をカンマ区切りで指定する文字列。比較型(string(デフォルト)・int・double・length)、順序(ascending(デフォルト)・descending)、大文字小文字の区別(case)、戻り値形式(index)を組み合わせて指定 |
| array | ソート対象の汎用配列(簡易配列は使用不可) |
戻り値¶
ソートされた汎用配列を返す。エラー時または入力配列が空の場合は空の配列を返す。index オプションを指定した場合は、ソート後の各要素の元の配列における位置を示す配列を返す。
解説¶
option は、比較型・順序・戻り値形式の3種類をカンマ区切りで並べて指定する。
- 比較型:
string(指定なしの場合の標準)、int、double、length。lengthはstringと一緒に使い、文字の内容ではなく文字の長さを対象に並べる('string,descending,length'のように書く) - 順序:
ascending(昇順。指定なしの場合の標準)、descending(降順) - 戻り値形式:
indexを指定すると、ソートした結果の配列そのものではなく、「ソート後の各位置が、ソート前の何番目の要素か」を示す配列を返す。たとえば'Z','G','A'を文字列昇順でソートすると、順番は A, G, Z になるので、整数の配列2,1,0が返る
比較型ごとに、各要素を次の値に変換して比べる。要素の型は見ないので、整数と文字列が混ざった配列も、指定した比較型で並べる。
| 比較型 | 比べる値 |
|---|---|
string |
要素を文字列にしたもの。辞書順に並べる。大文字小文字を区別しない(case を付けると区別する) |
length |
要素を文字列にしたものの長さ |
int |
要素を整数にしたもの |
double |
要素を実数にしたもの |
string で大文字小文字を区別しないときは、"A" と "a" のように大文字小文字だけが違う要素は同じ値とみなす。
_a = ('b', 'A', 'c', 'B', 'a')
ASORT('string', _a) // A,a,b,B,c (A と a、b と B の順は決まらない)
ASORT('string,case', _a) // A,B,a,b,c
同じ値とみなされた要素どうしの順番は保証されない(元の配列の順を保つとは限らない)。
要素が配列やハッシュのとき(Tc600-3以降)¶
要素が配列やハッシュ(値の入れ子)でも並べられる。比べる値は次のようになる。
string/length: TOSTR と同じ文字列(配列は1,2、ハッシュはk=aの形)int/double: 常に 0
返り値の要素は、配列やハッシュのまま(入れ子のまま)返る。
_v = PARSEJSON('[[3,1],[1,2],"b",[1,10],5]')
ASORT('string', _v) // (1,10),(1,2),(3,1),5,"b"
文字列にして比べるので、(1,10) は (1,2) より前になる("1,10" と "1,2" の辞書順)。また int / double では配列やハッシュはすべて同じ値とみなされ、その順番は保証されない。ハッシュの特定のキーの値で並べたいときは、キーの値の配列を作って index オプションで並べ、その順に元の配列の要素を取り出す。
_list = PARSEJSON('[{"n":3,"s":"c"},{"n":1,"s":"a"},{"n":2,"s":"b"}]')
_keys = IARRAY()
foreach _list ; _e { _keys ,= _e["n"] }
_sorted = IARRAY()
foreach ASORT('int,index', _keys) ; _i { _sorted ,= _list[_i] }
// _sorted の "n" は 1,2,3 の順
使用例¶
_array = ('BBBB','CCC','AA')
ASORT('string,ascending', _array) // "AA,BBBB,CCC" を出力
ASORT('string,descending,length', _array) // "BBBB,CCC,AA" を出力
互換性¶
- YAYA: Tc540-1 以降
indexオプション: Tc545-1 以降