2013-10-11 38 views
0

我一直在阅读一些使用sortUsingSelector方法对字符串对象排序数组的不同程序,我无法弄清楚它们是如何实现的。排序数组细分

每个程序首先定义如下排序方法:

[myBook sort]; /**myBook is the name of the array in the addressBook class**/ 

-(void) sort 
{ 
    [book sortUsingSelector: @selector (compareNames:)]; 
} 
/**compareNames is defined in the addressCard class**/ 

的排序方法使用似乎做所有的工作选择法:

-(NSComparisonResult) compareNames: (AddressCard *) element 
{ 
    return [name compare: element.name]; 
} 

其重要的注意,是两个不同的类:addressCard和addressBook。

我知道比较方法返回NSOrderedAscending,NSOrderedSame或NSOrderedDescending到sortUsingSelector方法。但是,这些方法如何去分类一切?我觉得我错过了一些巨大的东西。例如,比较方法如何知道数组中的哪些元素进行比较?我想象数组的元素[0]与元素[1]进行比较,然后进行排序,然后比较下一个元素...比较方法是否具有我忽略的默认定义?

+0

“重要的是要注意有两个不同的类:addressCard和addressBook”。不,就这个例子而言,这里涉及的唯一类是NSMutableArray和NSString。我们正在对一串字符串进行排序。琴弦来自何处,而阵列所在的地方并不重要。 – matt

回答

1

compare:方法(或任何您用作sortUsingSelector:中的参数的方法)只有一项工作:只给出两个对象(一对),告诉我如何排序它们。就是这样。

它知道如何做到这一点,因为它是由它发送到的类定义的。在这种情况下,name是一个NSString,因此我们使用NSString的compare:方法的定义 - 一个知道如何排序字符串的定义(使用关于字母顺序的规则)。

这是sortUsingSelector:方法,实际上将compare:方法对交给,呃比较。而它如何选择这些对就是它的业务。你没有被告知它是如何挑选这些对的。决定选择什么样的产品,以什么样的顺序进行深入的业务;它是您的计算机科学101课程的主题。但是在这种情况下,你会故意避开这些细节。

+0

所以'sortUsingSelector:'从数组中选择一个对象并将它们传递给'compare:',它将NSOrderedAscending,NSOrderedSame或NSOrderedDescending返回到'sortUsingSelector:'然后继续并按照相应的顺序进行排序? – Brosef

+0

是的,除非它明显反复进行,直到它计算出整个阵列的顺序。问题在于,指定为选择器的方法只需要知道如何回答一个简单的问题:无论你如何解释,这两个对象中的哪一个“更大”?它只是一个辅助函数。 'sortUsingSelector:'实际上是在进行排序,它使用什么算法是未知的而且非物质的。 – matt

+0

因此,如果我们数组中的字符串由姓氏和名字组成,我们想按姓氏的字母顺序对它们进行排序,那么我们可以创建一个自定义的比较方法来仅比较姓氏? – Brosef