1

sortこの本がandcompareNames:メソッドを使用して配列内の要素をアルファベット順に並べることについて話し始めたとき、私は少し混乱していました。compareNamesメソッドsortが呼び出されたときに、の引数はどのように取得されますか?そして、返されるすべてがタイプである場合、要素は実際にどのようにアルファベット順になりNSComparisonResultますか?

#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:)];
}
4

2 に答える 2

1

ANSComparisonResultNSOrderedAscending, NSOrderedSame,の 1 つにすぎませんNSOrderedDescending

メソッドcompareNamesは真の比較を担当します。この場合、文字列を比較しているため、メソッドは既に実装されている のメソッドに依存するだけcompareですNSString。結果は、アルファベット順に従って 2 つの文字列間の比較に関する情報を提供します。

の方法sortUsingSelectorNSMutableArray、データのカスタム タイプを並べ替えるのに便利な方法です (カスタム基準に従ってカスタム オブジェクトを並べ替えると、よりよく理解できます)。セレクターを受け入れます。つまり、2 つのオブジェクトを比較する必要があるたびに、セレクターによって指定されたメソッドが呼び出されます。

メソッドが内部的に使用することを知ることは許可されていないことを覚えていますsortUsingSelector(クイックソート/ヒープソート/バブルソート...)。知っておく必要があるのは、渡すメソッドの実装によって指定された基準を使用してオブジェクトが並べ替えられることです。セレクター付き。

于 2012-08-01T01:31:15.857 に答える
1

このメソッドは、比較する必要がある要素のペアごとにcompareNames:、並べ替えメソッド ( ) によって繰り返し呼び出されます。sortUsingSelector:引数を提供します。配列をソートするためにどの要素のペアを比較するかは、ソート アルゴリズムによって異なります。Apple のドキュメントにはどの方法が使用されているかは記載されていませんが、QuickSortはかなり一般的な方法です。ウィキペディアのページを見ると、アイテムのペアを繰り返し比較することで、配列全体を並べ替えることができることがわかるはずです。

于 2012-08-01T01:34:03.737 に答える