Как сортировать элементы NSMutableArray?

У меня есть класс модели, который содержит NSString- studentName, studentRank и studentImage. Я хочу отсортировать NSMutableArray по studentRanks. то, что я сделал, это

- (void)uploadFinished:(ASIHTTPRequest *)theRequest
{
    NSString *response = nil;
    response = [formDataRequest responseString];
    NSError *jsonError = nil;
    SBJsonParser *json = [[SBJsonParser new] autorelease];
    NSArray *arrResponse = (NSArray *)[json objectWithString:response error:&jsonError];
    if ([jsonError code]==0) {
        // get the array of "results" from the feed and cast to NSArray
        NSMutableArray *localObjects = [[[NSMutableArray alloc] init] autorelease];
        // loop over all the results objects and print their names
        int ndx;

        for (ndx = 0; ndx < arrResponse.count; ndx++) 
        {
            [localObjects addObject:(NSDictionary *)[arrResponse objectAtIndex:ndx]];
        }

        for (int x=0; x<[localObjects count]; x++) 
        {
            TopStudents *object = [[[TopStudents alloc] initWithjsonResultDictionary:[localObjects objectAtIndex:x]] autorelease];

            [localObjects replaceObjectAtIndex:x withObject:object];
        }

        topStudentsArray = [[NSMutableArray alloc] initWithArray:localObjects];

    }
}

Как я могу отсортировать это topStudentsArray в соответствии с рангами, полученными студентами, и если два или более студента имеют одинаковый ранг, как я могу их сгруппировать. мне понравилось

TopStudents *object;
    NSSortDescriptor * sortByRank = [[[NSSortDescriptor alloc] initWithKey:@"studentRank" ascending:NO] autorelease];
    NSArray * descriptors = [NSArray arrayWithObject:sortByRank];
    NSArray * sorted = [topStudentsArray sortedArrayUsingDescriptors:descriptors];

но это не отображает результаты должным образом. пожалуйста, помогите мне преодолеть эту проблему. заранее спасибо.


person Lion    schedule 14.09.2011    source источник
comment
Не могли бы вы наконец опубликовать значение, которое будет сохранено в localObjects?   -  person alloc_iNit    schedule 14.09.2011
comment
Какие результаты отображаются в этом случае?   -  person Joze    schedule 14.09.2011
comment
studentName, studentRank и studentImage в представлении.   -  person Lion    schedule 14.09.2011


Ответы (2)


Если вы хотите отображать в порядке рангов, вы должны установить ascending как YES.

NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"studentRank" ascending:YES];
person visakh7    schedule 14.09.2011
comment
В порядке. во-первых, спасибо, но как я могу сгруппировать их с одинаковыми рангами. - person Lion; 14.09.2011

сделать что-то подобное может помочь

Initially sort the arrGroupedStudents in the (ascending/descending) order of studentRank

//Create an array to hold groups
NSMutableArray* arrGroupedStudents = [[NSMutableArray alloc] initWithCapacity:[topStudentsArray count]];

for (int i = 0; i < [topStudentsArray count]; i++) 
{
    //Grab first student
    TopStudents* firstStudent = [topStudentsArray objectAtIndex:i];

    //Create an array and add first student in this array
    NSMutableArray* currentGroupArray = [[[NSMutableArray alloc] initWithCapacity:0] autorelease];
    [currentGroupArray addObject:firstStudent];

    //create a Flag and set to NO
    BOOL flag = NO;
    for (int j = i+1; j < [topStudentsArray count]; j++) 
    {
        //Grab next student
        TopStudents* nextStudent = [topStudentsArray objectAtIndex:j];  

        //Compare the ranks
        if ([firstStudent.studentRank intValue] == [nextStudent.studentRank intValue]) 
        {
            //if they match add this to same group
            [currentGroupArray addObject:nextStudent];
        }
        else {
            //we have got our group so stop next iterations
            [arrGroupedStudents addObject:currentGroupArray];
                           // We will assign j-1 to i
            i=j-1;
            flag = YES;
            break;
        }
    }
    //if entire array has students with same rank we need to add it to grouped array in the end
    if (!flag) {
        [arrGroupedStudents addObject:currentGroupArray];
    }
}

Наконец, ваш arrGroupedStudents будет содержать сгруппированный массив с одинаковым рангом. Я не тестировал код, поэтому вам может понадобиться исправить несколько неуместных вещей. Надеюсь, поможет

person Rahul Sharma    schedule 14.09.2011
comment
Хорошо- Рахул. сначала я проверю это, если получится, то я приму ваш ответ. Спасибо - person Lion; 14.09.2011
comment
Нет проблем, Лев.. Между тем, если вы столкнетесь с каким-либо хорошим подходом, который экономит время, поделитесь со всеми нами.. Удачного кодирования - person Rahul Sharma; 14.09.2011
comment
*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[__NSArrayM studentRank]: нераспознанный селектор отправлен в экземпляр 0x69ad7d0». В этой строке NSLog(@arrGroupedStudents name - %@ rank - %@,object.studentName, object.studentRank); - person Lion; 14.09.2011
comment
Это означает, что вы пытаетесь получить доступ к studentRank из объекта, который является массивом, а не объектом класса TopStudents. Попробуйте режим отладки и посмотрите, где происходит сбой приложения. - person Rahul Sharma; 14.09.2011
comment
Каков тип объекта в NSLog(@arrGroupedStudents name - %@ rank - %@,object.studentName, object.studentRank); - person Rahul Sharma; 14.09.2011
comment
NSString *studentName, *studentRank; - person Lion; 14.09.2011
comment
давайте продолжим это обсуждение в чате - person Lion; 14.09.2011