iPhone中NSMutableArray中的排序

iPhone中NSMutableArray中的排序,iphone,objective-c,cocoa,cocoa-touch,sorting,Iphone,Objective C,Cocoa,Cocoa Touch,Sorting,我正在解析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:(NS

我正在解析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]];    
    }
}
解析完成后,我需要按数字字段的速率对数组进行排序。
请建议。

如果您想按任意字典键对字典数组进行排序,那么我认为您要使用的是NSArray sortedArrayUsingFunction:context:和一个比较函数,该函数可以查找并比较您要排序的键。请查看有关该问题的文档


否则,您需要定义一个类来替换字典,并在该类中定义一个比较方法,然后使用sortedArrayUsingSelector:

如果您想按任意字典键对字典数组进行排序,然后我认为您要使用的是NSArray sortedarrayingfunction:context:以及一个比较函数,该函数查找并比较您要排序的键。请查看有关该问题的文档


否则,您需要定义一个类来替换词典,并在该类中定义一个比较方法,然后使用sortedArrayUsingSelector:

如果您有一个对象数组可以应用于词典,则每个对象都包含名字、姓氏、年龄,并且您希望按年龄排序:

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

如果您使用NSDictionary而不是my class A,则效果相同。

如果您有一个可应用于词典的对象数组,则每个对象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
如果您使用NSDICTORIAL而不是我的A类,则效果相同。

假设rates键包含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]];
假设rates键包含NSNumber:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"rates" ascending: YES];
[stories sortUsingDescriptors: [NSArray arrayWithObject: sortDescriptor]];
[sortDescriptor release];
另一方面,这行代码有一个漏洞:

[stories addObject:[item copy]];
我想你的意思是:

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

您应该阅读NSSortDescriptor:您应该阅读NSSortDescriptor:stefanB:“无需自动释放”不正确。提问者必须发送自动释放或发布,以平衡副本。我不知道上面的评论,我只知道这对我有用:DstefanB:“不需要自动释放”不正确。提问者必须发送自动释放或发布,以平衡副本。我不知道上面的评论,我只知道这对我有用:D