无法使用自定义比较器为两个属性排序数组

时间:2013-04-02 11:29:32

标签: iphone ios objective-c macos ipad

编辑: 正如我所知,甚至没有问题,我只是用错误的值来检查我的结果。

我在比较我的数据库的自定义对象和以非常特定的顺序对它们进行排序的目标时遇到了一些麻烦,原则上,它非常简单,排序机制必须使用此自定义对象的两个属性来表示按字符串,但也可以包含数值。

这是我正在尝试修复的自定义比较器块。

NSArray *sortedArray = [baseAry sortedArrayUsingComparator:^NSComparisonResult(Obj *o1, Obj *o2) {
NSComparisonResult comp1 = [o1.attr_a compare:o2.attr_a];
if (comp1 == NSOrderedSame) {
    return [o1.attr_b compare:o2.attr_b];    
}
return [o1.attr_a compare:o2.attr_a]; 
}];

最后,列表应如下所示:

  • 12 - 3
  • 12 - 8
  • 13 - 1
  • 14 - 2
  • 14 - 4
  • 22 - 1 等

但是使用当前比较器我只得到这样的结果:

  • 12 - 8
  • 12 - 3
  • 13 - 1
  • 14 - 4
  • 14 - 2
  • 22 - 3
  • 22 - 2
  • 22 - 1

使用一个代码块是否有一种舒适的方法可以做到这一点?我可以想象的另一种方法是将列表分成子列表并将它们分开排序并最终将它们粘合在一起,但这可能需要更高的计算能力

1 个答案:

答案 0 :(得分:0)

您应首先比较两个对象的attr_a。如果它们相等,则比较两个对象的attr_b

NSComparisonResult comp = [o1.attr_a compare:o2.attr_a];
if (comp == NSOrderedSame) {
    comp = [o1.attr_b compare:o2.attr_b];    
}
return comp; 

(您的代码将第一个对象的attr_a与第二个对象的attr_b进行比较,这没有多大意义。)