【问题标题】:glib: sort by multiple attributesglib:按多个属性排序
【发布时间】:2014-05-05 00:25:48
【问题描述】:

我正在使用 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。如何实施?

【问题讨论】:

    标签: sorting glib


    【解决方案1】:

    我使用了一些“hack”来实现这种排序。

    • 将要排序的两个属性设为uint32_t 类型。
    • 将另一个属性uint64_tfor_sort 添加到我的结构中
    • for_sort的高32位移动为attr1
    • for_sort 的低 32 位为attr2
    • 数组按for_sort排序,然后项目先按attr1排序,再按attr2排序。

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

    缺点:

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

    【讨论】:

    • 这对无符号整数有效,但对有符号整数无效。
    【解决方案2】:

    这很简单——比较函数根据第一个值是小于、等于还是大于第二个值返回小于、等于或大于零。您需要做的就是比较第一个属性,如果返回值不等于 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;
    }
    

    【讨论】:

    • 请尽量充实你的答案。仅仅发布一个没有任何解释或上下文的代码块是不好的。在目前的状态下,您的答案可能对其他寻找此问题的答案的人没有多大用处。
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2016-01-06
    • 2012-02-22
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多