[genie / vala]:如何使用自定义比较器排序?

时间:2014-10-26 11:09:10

标签: vala genie

精灵! 如何按照长度递减的顺序对字符串的数组(或列表)进行排序,并按字母顺序排列相同长度的字符串。

我的数据是

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

3 个答案:

答案 0 :(得分:4)

Genie和Vala的内置数组类型不是很友好,因为它实际上是一个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方法。

答案 1 :(得分: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;
}

关于GLib.GenericArray的一个非常好的事情是它使用C数组作为其底层存储。如果在代码中的其他位置使用常规数组,则可以使用GLib.GenericArray.data字段访问基础数组,并可能避免复制整个数组。当然,它也不会强迫对libgee的依赖。

最后,您选择变量名称......&#39;数据&#39;是复数,单数的数据&#39;是基准&#39;。我只提出来,所以我有借口发帖this

XKCD 1429

答案 2 :(得分: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]