2012-08-01 143 views
1

當本書開始使用sortcompareNames:方法開始討論數組中的字母順序元素時,我有些困惑。在調用方法sort時獲得的compareNames的參數如何?當所有返回的元素都是NSComparisonResult類型時,元素如何實際獲得字母順序?混淆sortUsingSelector

#import <Foundation/Foundation.h> 

@interface AddressCard : NSObject 
@property (copy, nonatomic) NSString *name, *email; 

-(NSComparisonResult) compareNames: (id) element; 

@end 

@implementation AddressCard 
@synthesize name, email; 

-(NSComparisonResult) compareNames:(id)element { 
    return [name compare: [element name]]; 
} 
@end 

#import "AddressCard.h" 
#import <Foundation/Foundation.h> 

@interface AddressBook : NSObject 
@property (nonatomic, copy) NSString *bookName; 
@property (nonatomic, strong) NSMutableArray *book; 

-(void) addCard: (AddressCard *) myCard; 
-(void) sort; 

@end 

@implementation AddressBook 
@synthesize book, bookName; 

-(void) sort { 
    [book sortUsingSelector: @selector(compareNames:)]; 
} 

回答

1

一個NSComparisonResult只是NSOrderedAscendingNSOrderedSameNSOrderedDescending之一。

方法compareNames負責真正的比較。在這種情況下,由於您正在比較字符串,因此該方法僅依賴於NSString的已實施的compare方法。結果根據字母順序給出關於兩個字符串之間比較的信息。

方法sortUsingSelectorNSMutableArray是一種排序自定義數據類型的有用方法(如果您嘗試根據自定義條件對自定義對象進行排序,可以更好地理解)。它接受一個選擇器,這意味着每次需要比較兩個對象時,都會調用由選擇器指定的方法。

對於我記得你不允許知道內部使用方法sortUsingSelector(快速排序/堆排序/冒泡排序...),你需要知道的是,該對象使用實現指定的標準進行排序您使用選擇器傳遞的方法。

1

對於需要比較的每對元素,compareNames:方法通過排序方法(sortUsingSelector:)重複調用;它提供了參數。確切地說,它比較排序數組的哪些元素對取決於排序算法。 Apple文檔沒有提及使用哪種方法,但QuickSort是相當常見的方法。如果你看維基百科頁面,你應該能夠看到如何通過重複比較項目對,你可以結束整個數組排序。