1

精霊!文字列の配列 (またはリスト) を長さの降順で並べ替える方法と、同じ長さの文字列の場合は辞書式の昇順で並べ替える方法。

私のデータは

  datas : array of string = { 
    "cold", "z", "bpples", "pallalala", "apples", "xccv" 
    }
4

3 に答える 3

4

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メソッドを使用します。

于 2014-10-26T12:07:25.350 に答える
4

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' です。私はそれを持ち出すだけなので、これを投稿する言い訳があります

XKCD1429

于 2014-10-27T02:53:47.673 に答える