Как сравнить свойства объекта затем сортировать с помощью (sortusingselector: @selector)? - PullRequest
4 голосов
/ 15 ноября 2011

Я пытаюсь написать простую функцию == «compareGPA», которая сравнивает GPA двух студентов, а затем сортирует их по убыванию, используя селектор следующим образом: [array sortUsingSelector: @selector (compareGPA :)];

Я пытался написать функцию двумя разными способами, но ничего не работает,

Первый способ:

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

Student *tmp =[Student new];

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

return (NSComparisonResult) tmp;

}

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

{ return (NSComparisonResult) OtherStudent; }


}

2-й способ:

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

}

}

Вывод: ничего

Есть предложения ??

Ответы [ 2 ]

6 голосов
/ 15 ноября 2011

Вы должны сделать свой метод caparison

+(NSComparisonResult) compareGPA: (Student *) OtherStudent

метод экземпляра (не метод класса, + становится -), так что он сравнивает GPA получателя с GPA OtherStudent), как это

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

}

Затем отсортируйте массив объектов Student с помощью селектора @selector(compareGPA:)

5 голосов
/ 15 ноября 2011

Поскольку вы используете compare:, я должен предположить, что getGPA возвращает NSNumber, и в этом случае все, что вам нужно, это:

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

Однако, если getGPA должен был вернуть некоторый тип 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...