对一个包含NSDictionary的NSArray进行排序

3

我需要对一个字典数组进行排序,但是排序的依据是字典中的一个对象。

3个回答

13
使用NSSortDescriptors和 -sortedArrayUsingDescriptors: 方法。对于关键路径,传入字典键,后跟您想要排序的对象键。在以下示例中,您有一个字典数组,这些字典具有“personDictionaryKey”下的人,并且“person”具有“lastName”键。
NSSortDescriptor * descriptor = [[[NSSortDescriptor alloc] initWithKey:@"personInDictionary.lastName" 
        ascending:YES] autorelease]; // 1
NSArray * sortedArray = [unsortedArray sortedArrayUsingDescriptors:
        [NSArray arrayWithObject:descriptor]];

1 -在10.6中,有用于创建排序描述符的类便捷方法,但正如bbum的答案所说,现在有了启用块的排序方法,我打赌它们会更快。此外,我注意到你的问题是关于iOS的,所以那可能是无关紧要的。 :-)


或者这样,是的...我总是忘记排序描述符。 - bbum
我还没有机会深入研究块(因为没有10.6专属项目),但迫不及待想要开始。 :-) - Joshua Nozzi

1
重新表述一下:您想通过比较字典内容来对数组进行排序吗?(也就是说,您知道无法对字典的内容进行排序,对吧?)
正如Joshua所建议的那样,使用NSSortDescriptor和sortedArrayUsingDescriptors:。这很可能是最好的解决方案;至少是最直接的。
还有其他方法。
假设您的目标是iOS 4.0,则可以使用sortedArrayUsingComparator:并传递一个块,该块将比较两个字典的内容。
如果您的目标是iOS 3.x(包括iPad),则应使用sortedArrayUsingFunction:context:。
或者,正如Joshua所建议的那样,使用NSSortDescriptor和sortedArrayUsingDescriptors:
所有这些都有很好的文档和示例。

0

这里有一个使用自定义对象而不是字典的实现:

ArtistVO *artist1 = [ArtistVO alloc];
artist1.name = @"Trentemoeller";
artist1.imgPath = @"imgPath";

ArtistVO *artist2 = [ArtistVO alloc];
artist2.name = @"ATrentemoeller";
artist2.imgPath = @"imgPath2";


ArtistVO *artist3 = [ArtistVO alloc];
artist3.name = @"APhextwin";
artist3.imgPath = @"imgPath2";    

//NSLog(@"%@", artist1.name);
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:artist1];
[arr addObject:artist2];
[arr addObject:artist3];


NSSortDescriptor *lastDescriptor =
[[[NSSortDescriptor alloc]
  initWithKey:@"name"
  ascending:YES
  selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];    

NSArray * descriptors =
[NSArray arrayWithObjects:lastDescriptor, nil];
NSArray * sortedArray =
[arr sortedArrayUsingDescriptors:descriptors];    

NSLog(@"\nSorted ...");
NSEnumerator *enumerator;
enumerator = [sortedArray objectEnumerator];

ArtistVO *tmpARt;
while ((tmpARt = [enumerator nextObject])) NSLog(@"%@", tmpARt.name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接