Как отсортировать элементы NSMutableArray? - PullRequest
1 голос
/ 14 сентября 2011

У меня есть класс модели, который содержит NSString's- 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];

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

Ответы [ 3 ]

2 голосов
/ 14 сентября 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 будут содержать сгруппированный массив с равным рангом.Я не тестировал запуск кода, поэтому вам может понадобиться исправить некоторые вещи, которые неуместны.Надеюсь, это поможет

1 голос
/ 14 сентября 2011

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

NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"studentRank" ascending:YES];
0 голосов
/ 14 сентября 2011
static int mySortFunc(NSDictionary *dico1, NSDictionary *dico2, void *context)
{
    NSString *studentName1 = [dico1 objectForKey:@"studentName"];
    NSString *studentName2 = [dico2 objectForKey:@"studentName"];
    return [studentName1 compare:studentName2];
}

- (IBAction)sortBtnTouched:(id)sender
{
    [topStudentsArray sortUsingFunction:mySortFunc context:NULL];
}
...