Iphone 无法使用两个属性的自定义比较器对数组进行排序
编辑: 我发现,根本没有问题,我只是用了错误的值来检查结果 我在比较数据库中的自定义对象时遇到了一点困难,我的目标是按照非常特定的顺序对它们进行排序。原则上,这很简单,排序机制必须处理这个自定义对象的两个属性,它们由字符串表示,但也可能包含数值 这是我目前正在尝试修复的自定义比较器块Iphone 无法使用两个属性的自定义比较器对数组进行排序,iphone,ios,objective-c,macos,ipad,Iphone,Ios,Objective C,Macos,Ipad,编辑: 我发现,根本没有问题,我只是用了错误的值来检查结果 我在比较数据库中的自定义对象时遇到了一点困难,我的目标是按照非常特定的顺序对它们进行排序。原则上,这很简单,排序机制必须处理这个自定义对象的两个属性,它们由字符串表示,但也可能包含数值 这是我目前正在尝试修复的自定义比较器块 NSArray *sortedArray = [baseAry sortedArrayUsingComparator:^NSComparisonResult(Obj *o1, Obj *o2) { NSCompar
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
是否有一种舒适的方法可以用一段代码来实现这一点?我可以想象的另一种方法是将列表拆分为子列表,并分别对它们进行排序,最后将它们粘在一起,但这可能需要更高的计算能力,您应该首先比较两个对象的属性。如果它们相等,比较两个对象的属性:
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
进行比较,这没有多大意义。)如果您返回相同的值,那么如果循环检查比较的值相同,那么需要什么?您的问题看起来与此问题类似,您也可以这样做:NSSortDescriptor*firstSorter=[[NSSortDescriptor alloc]initWithKey:@“firstProperty”升序:是];NSSortDescriptor*secondSorter=[[NSSortDescriptor alloc]initWithKey:@“secondProperty”升序:是];NSArray*SortDarray=[array SortDarray UsingDescriptor:@[firstSorter,secondSorter]];因为我还不能回答我自己的问题:我找到了答案。你的两个解决方案(以及我实施的方案)都会奏效,我只是为比较显示了错误的值。感谢大家抽出时间!抱歉,我刚意识到我的代码在开始时有一个错误:它正是您刚才发布的内容。似乎不是这样。我比较attr_a,如果它们相同,我分别比较attr_b和return。