精灵!如何按长度降序对字符串数组(或列表)进行排序,对相等长度的字符串按字典升序排序。
我的数据是
datas : array of string = {
"cold", "z", "bpples", "pallalala", "apples", "xccv"
}
我对 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'。我只是提出来,所以我有借口发布这个:
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]