1

精灵!如何按长度降序对字符串数组(或列表)进行排序,对相等长度的字符串按字典升序排序。

我的数据是

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

3 回答 3

4

Genie 和 Vala 的内置数组类型不是很友好,因为它实际上是一个 C 数组。你必须使用C 的qsort函数来做到这一点。

我建议您改用 a Gee.List,它有一个很好的sort方法,需要一个比较器:

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. 您也可以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'。我只是提出来,所以我有借口发布这个

XKCD 1429

于 2014-10-27T02:53:47.673 回答
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]
于 2014-10-26T19:55:09.680 回答