glib:按多个属性排序

时间:2014-05-02 09:24:20

标签: 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();
g_ptr_array_add(values, v);
...
g_ptr_array_sort(values, (GCompFunction) cmp_values_by_attr1);

现在在我的数组中,我想先按attr1排序,然后按attr2排序。如何实施?

2 个答案:

答案 0 :(得分:0)

这很简单 - 比较函数返回小于,等于或大于零,具体取决于第一个值是小于,等于还是大于第二个值。您需要做的就是比较第一个属性,如果返回值不等于零则返回结果,否则比较第二个属性并返回结果:

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;
}

答案 1 :(得分:0)

我已经使用了一些' hack'实现这种排序。

  • 将两个属性排序为uint32_t个类型。
  • 将另一个属性uint64_t for_sort添加到我的struct
  • for_sort的高32位移至attr1
  • for_sort的低32位为attr2
  • for_sort对数组进行排序,然后首先按attr1排序,然后按attr2排序。

我已经实施并验证它正在运作。

缺点:

  • 要添加for_sort
  • 的额外内存
  • 额外处理
  • 如果排序属性属于其他类型,则需要相应更改。