[genie/vala]: Как сортировать с помощью пользовательского компаратора?

джинн! как отсортировать массив (или список) строк в порядке убывания длины и в возрастающем лексикографическом порядке для строк одинаковой длины.

мои данные

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

person Naam Famas    schedule 26.10.2014    source источник
comment
да не очень понятно   -  person Naam Famas    schedule 28.10.2014


Ответы (2)


Встроенный тип массива Genie и Vala не очень удобен, так как на самом деле это массив C. Для этого вам придется использовать функцию C qsort.

Я бы порекомендовал вам вместо этого использовать Gee.List, у которого есть хороший метод sort, который принимает компаратор:

var list = new Gee.List<string>();
list.add("cold");
...
list.sort((a, b) => - a.collate(b));

Здесь этот список будет отсортирован в обратном порядке. По умолчанию используется лексикографическая сортировка (в алфавитном порядке). Если вам нужен массив в конце, используйте метод to_array.

person apmasell    schedule 26.10.2014

Я мало чем могу помочь с 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. Вы также можете использовать Posix.qsort, как упоминалось в apmasell, но это немного сложнее.

Как упоминалось в apmasell и txasatonga, вы можете использовать тип данных из libgee, но если вы уже не используете libgee, вы можете вместо этого использовать что-то из glib. В этом случае подойдет GLib.GenericArray. В Вале это будет выглядеть так:

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;
}

Одна очень приятная особенность GLib.GenericArray заключается в том, что он использует массив C в качестве основного хранилища. Если вы используете обычные массивы в других местах своего кода, вы можете получить доступ к базовому массиву, используя GLib.GenericArray.data и потенциально избежать копирования всего массива. И, конечно же, это также не навязывает зависимость от libgee.

Наконец, ваш выбор имени переменной… «данные» во множественном числе, «данные» в единственном числе. Я упоминаю об этом только потому, что у меня есть повод опубликовать это:

XKCD 1429

person nemequ    schedule 27.10.2014
comment
Привет! Я хочу знать, как перевести эту строку на джинн. благодаря. GLib.qsort_with_data‹string› (datas, sizeof(string), (a, b) => GLib.strcmp (a, b)); - person Naam Famas; 28.10.2014
comment
Я нашел это наконец!! Это некрасиво, но работает. спасибо.qsort_with_data строки (...) - person Naam Famas; 29.10.2014