2011-11-15 34 views
4

我想寫一個簡單的函數==「compareGPA」,比較兩個學生的GPA,然後按降序排序他們使用選擇器,因爲:[array sortUsingSelector:@selector(compareGPA :)];如何比較對象屬性然後使用(sortusingselector:@selector)進行排序?

我試着寫了兩種不同的方式的功能,但沒有任何工程,

第一種方式:

+(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

什麼類getGpa返回排序的Student對象的數組?詮釋? – DanZimm

+0

返回浮動 –

回答

6

你應該讓你的美服方法

+(NSComparisonResult) compareGPA: (Student *) OtherStudent 

一個實例方法(不是一個類的方法,+變爲 - ),使其接收器的GPA與OtherStudent的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]] 

} 

然後使用選擇@selector(compareGPA:)

+0

我做了上述步驟,程序運行沒有任何錯誤或警告,但沒有出現在控制檯窗口上,我已經創建了數組並添加了對象並調用:[array sortUsingSelector:@selector (compareGPA :)]; ,你覺得怎麼想? –

+0

請發佈您的代碼。 – jbat100

+0

它現在正常工作,非常感謝:) –

5

當你使用compare:我必須假設getGPA返回NSNumber,在這種情況下,所有你需要會是這樣:

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

相關問題