精灵! 如何按照长度递减的顺序对字符串的数组(或列表)进行排序,并按字母顺序排列相同长度的字符串。
我的数据是
datas : array of string = {
"cold", "z", "bpples", "pallalala", "apples", "xccv"
}
答案 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:
答案 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]