精霊!文字列の配列 (またはリスト) を長さの降順で並べ替える方法と、同じ長さの文字列の場合は辞書式の昇順で並べ替える方法。
私のデータは
datas : array of string = {
"cold", "z", "bpples", "pallalala", "apples", "xccv"
}
Genie と Vala の組み込みの配列型は、実際にはその下にある C 配列であるため、あまり友好的ではありません。それを行うには、 Cのqsort
関数を使用する必要があります。
Gee.List
代わりに、コンパレータを使用する優れたsort
メソッドを持つ aを使用することをお勧めします。
var list = new Gee.List<string>();
list.add("cold");
...
list.sort((a, b) => - a.collate(b));
ここで、このリストは逆順でソートされます。デフォルトでは、辞書式照合 (アルファベット順) が使用されます。最後に配列が必要な場合は、to_array
メソッドを使用します。
Genie ではあまり役に立ちませんが、Vala では次のようになります。
private static int main (string[] args) {
string[] datas = new string[] {
"cold", "z", "bpples", "pallalala", "apples", "xccv"
};
GLib.qsort_with_data<string> (datas, sizeof(string), (a, b) => GLib.strcmp (a, b));
return 0;
}
基本的に、キーはGLib.qsort_with_data
. 前述の apmasell のように使用することもできますがPosix.qsort
、少し難しくなります。
apmasell と txasatonga が言及したように、libgee のデータ型を使用できますが、すでに libgee を使用していない限り、代わりに glib のデータ型を使用することをお勧めします。この場合は、GLib.GenericArray
ぴったりでしょう。Vala では、次のようになります。
private static int main (string[] args) {
GLib.GenericArray<string> datas = new GLib.GenericArray<string> ();
datas.add ("cold");
datas.add ("z");
datas.add ("pallalala");
datas.add ("apples");
datas.add ("xccv");
datas.sort (GLib.strcmp);
return 0;
}
非常に優れている点の 1 つGLib.GenericArray
は、基になるストレージとして C 配列を使用することです。コード内の他の場所で通常の配列を使用している場合は、GLib.GenericArray.data
フィールドを使用して基になる配列にアクセスでき、配列全体のコピーを回避できる可能性があります。もちろん、libgee への依存も強制しません。
最後に、変数名を選択します... 'data' は複数形で、'data' の単数形は 'datum' です。私はそれを持ち出すだけなので、これを投稿する言い訳があります: