Сортировка в NSMutableArrary в iPhone - PullRequest
1 голос
/ 09 января 2010

Я анализирую XML и сохраняю все данные в NSMutableArray в форме словаря.

NSMutableArray * stories;   

// a temporary item; added to the "stories" array one at a time,
// and cleared for the next one
NSMutableDictionary * item;

- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName
{       
    if ([elementName isEqualToString:@"item"])
    {
        // save values to an item, then store that item into the array...
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];

        //Numeric value for sorting
        [item setObject:rates forKey:@"rates"];

        [stories addObject:[item copy]];    
    }
}

Как только я закончу с разбором, мне нужно отсортировать массив по "ставкам", которые числовые. Пожалуйста, предложите.

Ответы [ 3 ]

5 голосов
/ 09 января 2010

Предполагая, что ключ rate содержит NSNumbers:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"rates" ascending: YES];
[stories sortUsingDescriptors: [NSArray arrayWithObject: sortDescriptor]];
[sortDescriptor release];

В примечании, связанном с этой строкой кода, есть утечка:

[stories addObject:[item copy]];

Я думаю, что вы имели в виду вместо этого:

[stories addObject:[[item copy] autorelease]];
0 голосов
/ 09 января 2010

Если у вас есть массив объектов (может применяться к словарям), каждый объект (A) содержит имя, фамилию, возраст и вы хотите отсортировать по возрасту:

NSMutableArray * array = [NSMutableArray array];
[array addObject:[A aWithFirstName:@"John"
                          lastName:@"Blay"
                               age:[NSNumber numberWithInt:30]]];
[array addObject:[A aWithFirstName:@"John"
                          lastName:@"Albort"
                               age:[NSNumber numberWithInt:15]]];
[array addObject:[A aWithFirstName:@"Axel" 
                          lastName:@"Albort" 
                               age:[NSNumber numberWithInt:40]]];
[array addObject:[A aWithFirstName:@"Peter"
                          lastName:@"Albort" 
                               age:[NSNumber numberWithInt:20]]];
[array addObject:[A aWithFirstName:@"Kevin"
                          lastName:@"Klein" 
                               age:[NSNumber numberWithInt:20]]];
// create sort descriptor
NSSortDescriptor * ageDescriptor = 
    [[[NSSortDescriptor alloc] initWithKey:@"age"
                                ascending:YES] autorelease];
NSArray * descriptors;
NSArray * sortedArray;
// array of sort descriptor - could use multiple descriptors for sorting
descriptors = [NSArray arrayWithObjects:ageDescriptor, nil];
// sort data
sortedArray = [array sortedArrayUsingDescriptors:descriptors];
// print out sorted data
id obj;
NSEnumerator * enumerator;
enumerator = [sortedArray objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

Вывод (отсортировано по возрасту):

2010-01-09 22:14:38.391 x[38860:903] Albort, John; age 15
2010-01-09 22:14:38.391 x[38860:903] Albort, Peter; age 20
2010-01-09 22:14:38.392 x[38860:903] Klein, Kevin; age 20
2010-01-09 22:14:38.393 x[38860:903] Blay, John; age 30
2010-01-09 22:14:38.393 x[38860:903] Albort, Axel; age 40

Это работает так же, если вместо моего класса А вы используете NSDictonary.

0 голосов
/ 09 января 2010

Если вы хотите отсортировать массив словарей по произвольному ключу словаря, то я думаю, что вы хотите использовать NSArray sortedArrayUsingFunction: context: с функцией сравнения, которая ищет и сравнивает ключи, по которым вы хотите отсортировать. Ознакомьтесь с документацией по этому вопросу.

В противном случае вам потребуется определить класс для замены словаря и определить метод сравнения в этом классе, а затем использовать sortedArrayUsingSelector:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...