【发布时间】:2011-03-03 08:44:13
【问题描述】:
我用谷歌搜索过 stackoverflow,但没有得到满意的答案。
在文档中,它指出:
sortUsingSelector:对数组的排序 元素按升序排列,如 比较法确定 由给定的选择器指定。
- (void)sortUsingSelector:(SEL) 比较器 参数比较器选择器 指定要使用的比较方法 比较数组中的元素。这 比较器消息被发送到每个 数组中的对象,并作为其 单个参数中的另一个对象 大批。比较方法应该 如果数组返回 NSOrderedAscending 小于参数, NSOrderedDescending 如果数组是 大于论点,并且 NSOrderedSame 如果它们相等。
我试图了解它的实际工作原理。所以如果我在我的对象中有这个方法 数组类:
- (NSComparisonResult) compareNames: (id) element
{
return [userName compare: [element userName]];
}
然后执行它
[myArray sortUsingSelector:@selector(compareNames:);
它有效。问题是我不知道它为什么起作用。 NSComparisonResult 的返回类型 是升序、相同或降序。从我通过阅读文档得到的是 compareNames 方法被发送到 myArray 中的每个对象并比较选定的对象 对象属性(在本例中为 userName)与 userName 在另一个对象中 相同的数组。 (就像 [0] 数组与 [1] 数组进行比较)。我想知道这是怎么回事 整个过程正在进行中。
更新 1:多键排序算法
我错过了!在比较中。应该是这样的:
NSComparisonResult res;
res = [[self userName] compare: [element userName]];
if(res == NSOrderedSame) res = [[self email] compare: [element email]];
return res;
至于降序排序,您可以使用 switch 或 if 将“return res”替换为以下内容来恢复 NSComparisonResult 值:
switch (res)
{
case NSOrderedAscending:
return NSOrderedDescending;
break;
case NSOrderedDescending :
return NSOrderedAscending;
break;
default:
return NSOrderedSame;
break;
}*/
【问题讨论】:
-
你到底有什么不明白的?基本上,它比较所有对象对并交换它们,如果它们的顺序错误。 (但实际上,不必比较所有对,n*log(n) 就足够了。)
-
总是按升序排序吗?如果我想按多个值排序怎么办。就像按名称排序,然后按电子邮件排序。
标签: objective-c sorting