2011-11-15 9 views
4

私は、2人の生徒のGPAを比較し、次にそれらをセレクタを使って降順に並べ替える単純な関数== "compareGPA"を書こうとしています:[ar​​ray sortUsingSelector:@selector(compareGPA :)];オブジェクトのプロパティを比較するには、(sortusingselector:@selector)を使用してソートしますか?

私は2種類の方法で関数を記述しようとしましたが、何も動作、

最初の方法:

+(NSComparisonResult) compareGPA: (Student *) OtherStudent{ 

Student *tmp =[Student new]; 

if ([OtherStudent getGpa] < [tmp getGpa]){ 

return (NSComparisonResult) tmp; 

} 

if([tmp getGpa] < [OtherStudent getGpa]) 

{ return (NSComparisonResult) OtherStudent; } 


} 

第二の方法:

+(NSComparisonResult) compareGPA: (Student *) OtherStudent{ 


NSComparisonResult res; 


res = [[self getGpa] compare: [OtherStudent getGpa]]; 

return res; 

Switch (res) 
{ 

case NSOrderedAscending: 

return NSOrderedDescending; 

break; 

case NSOrderedDescending: 

return NSOrderedAscending; 

break; 

default: 

return NSOrderedSame; 

break; 

} 

} 

出力:Nothing

提案がありますか?

+0

を使用してStudentオブジェクトのあなたの配列をソート? int? – DanZimm

+0

返品フロート –

答えて

6

あなたのcaparison方法

+(NSComparisonResult) compareGPA: (Student *) OtherStudent 

インスタンスメソッドにする必要があります(ないクラスメソッド、+となり - )、それはこの

のように、)OtherStudentのGPAと受信者のGPAを比較するよう
-(NSComparisonResult) compareGPA: (Student *) OtherStudent { 

    // if GPA is a float int double ... 
    if ([OtherStudent getGpa] == [self getGpa] 
     return NSOrderedSame; 
    if ([OtherStudent getGpa] < [self getGpa]){ 
     return NSOrderedAscending; 
    return NSOrderedDescending; 

    // if GPA is an object which responds to the compare: message 
    return [[self getGPA] compare:[OtherStudent getGPA]] 

} 

その後getGpaを返しているものをクラスセレクタ@selector(compareGPA:)

+0

私は上記の手順を実行し、プログラムはエラーや警告なしで実行されますが、コンソールウィンドウに何も表示されません。私はすでに配列を作成してオブジェクトを追加して呼び出しました:[array sortUsingSelector:@selector (比較GPA :)]; 、あなたは何が欠けていると思いますか? –

+0

あなたのコードを投稿してください。 – jbat100

+0

これは今、うまく動作します、ありがとう非常に:) –

5

あなたは私はあなたが必要とするだろうすべてはこのことでしょう。その場合には、getGPANSNumberを返すことを想定しなければならないcompare:を使用しているとして:

NSArray *students = ...; 
NSArray *sortedStudents = [students sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"getGPa" ascending:NO]]]; 

getGPA場合(ただし、いくつかのprimiticeのC型を返すことでしたこうしたあなたのケースでfloat)として、あなたは、このようにそれを行うことができます:

NSArray *students = ...; 
NSArray *sortedStudents = [students sortedArrayUsingComparator:^NSComparisonResult(Studen *student1, Studen *student2) { 
    float student1GPA = [student1 getGPA]; 
    float student2GPA = [student2 getGPA]; 
    if (student1GPA < student2GPA) { 
     return NSOrderedAscending; 
    } else if (student1GPA > student2GPA) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
}]; 

あなたも、他の場所でcompareGPA:が必要な場合は場合:

- (NSComparisonResult) compareGPA:(Studen *otherStudent) { 
    float student1GPA = [self getGPA]; 
    float student2GPA = [otherStudent getGPA]; 
    if (student1GPA < student2GPA) { 
     return NSOrderedAscending; 
    } else if (student1GPA > student2GPA) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
} 
+0

ありがとう、m8。これはちょうど私の心を滑った。 LoL – Felipe

+0

ありがとう、非常にスマート – smoothumut

関連する問題