Sorting glib:按多个属性排序
我正在使用glib进行排序:Sorting glib:按多个属性排序,sorting,glib,Sorting,Glib,我正在使用glib进行排序: gint cmp_values_by_attr1(gpointer a, gpointer b) { my_strcut *seq_a = *((my_strcut**) a); my_strcut *seq_b = *((my_strcut**) b); return (seq_a->attr1 - seq_b->attr1); } values = g_ptr_array_sized_new(4); v = new_struct()
gint cmp_values_by_attr1(gpointer a, gpointer b) {
my_strcut *seq_a = *((my_strcut**) a);
my_strcut *seq_b = *((my_strcut**) b);
return (seq_a->attr1 - seq_b->attr1);
}
values = g_ptr_array_sized_new(4);
v = new_struct();
g_ptr_array_add(values, v);
...
g_ptr_array_sort(values, (GCompFunction) cmp_values_by_attr1);
现在在我的数组中,我想先按
attr1
排序,然后按attr2
排序。如何实现?比较函数返回小于、等于或大于零非常简单,这取决于第一个值是小于、等于还是大于第二个值。您只需比较第一个属性,如果返回值不等于零,则返回结果,否则比较第二个属性并返回结果:
gint comp_values (gpointer a, gpointer b) {
gint res;
my_strcut *seq_a = *((my_strcut**) a);
my_strcut *seq_b = *((my_strcut**) b);
res = seq_a->attr1 - seq_b->attr1;
if (res == 0) {
res = (seq_a->attr2 - seq_b->attr2);
}
return res;
}
我使用了一些“黑客”来实现这种排序
- 将要排序的两个属性设置为
类型uint32\t
- 将排序的另一个属性
uint64\u t
添加到我的结构中
- 将排序的
的上32位移位为
attr1
- _sort的
低位32位为
attr2
- 按
,项目首先按对数组进行排序对于_Sort
排序,然后按attr1
排序attr2
- 要添加
以进行排序的额外内存
- 额外处理
- 如果排序属性属于其他类型,则需要相应更改