2014-10-26 1 views
1

джинсы! Как отсортировать массив (или список) строк в порядке убывающей длины и в восходящем лексикографическом порядке для строк одинаковой длины.[genie/vala]: Как сортировать с помощью пользовательского компаратора?

мои данные

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

yes.it не очень ясно –

ответ

3

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

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

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

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

+0

Привет! Огромное спасибо. –

2
uses Gee 
init 
    a:list of string 
    a= new list of string 
    a.add("aa") 
    a.add("ab") 
    a.add("z") 
    a.add("eas") 
    // ordenar alfabeticamente 
    a.sort() 
    // ordenar la lista según la longitud 
    for var x=1 to (a.size-1) 
     for var y=0 to (a.size-2) 
      var v1=a[y] 
      var v2=a[y+1] 
      if (v1.length < v2.length) 
       var r= a[y] 
       a[y]=a[y+1] 
       a[y+1]=r 
    for var i=0 to (a.size-1) 
     print a[i] 
+0

большое спасибо. –

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

Как упомянутый 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; 
} 

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

И, наконец, ваш выбор имени переменной ... 'data' является множественным, единственное значение 'data' - это 'datum'. Я только привести его так, у меня есть предлог, чтобы отправить this:

XKCD 1429

+0

спасибо! GenericArray работает! –

+0

Привет! Я хочу знать, как перевести эту линию на джиннов. Благодарю. GLib.qsort_with_data (datas, sizeof (string), (a, b) => GLib.strcmp (a, b)); –

+0

Я нашел это, наконец! Это уродливо, но работает. thanks.qsort_with_data строки (...) –