2010-10-13 110 views

回答

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的,所以这可能是无关紧要的。 :-)

+0

还是这个,是的......我总是忘了排序描述符。 – bbum 2010-10-13 16:08:15

+0

我还没有机会自己钻研(没有10.6的项目),但迫不及待地开始。 :-) – 2010-10-13 16:14:38

+0

好的,thx!明天我尝试实现这个逻辑 – Kazzar 2010-10-13 21:28:21

1

要改写;你想通过比较字典内容来排序数组? (也就是说,你知道你无法对词典的内容进行排序,对吧?)

正如约书亚所说,使用NSSortDescriptorsortedArrayUsingDescriptors:。这很可能是最好的解决方案;至少最直接的。

还有其他的方法。

假设您的目标是iOS 4.0,那么您可以使用sortedArrayUsingComparator:并传递一个块来比较两个字典的内容。

如果您的目标是iOS 3.x(包括iPad),那么您将使用sortedArrayUsingFunction:context:

或者,如乔舒亚建议,使用NSSortDescriptorsortedArrayUsingDescriptors:

所有这些都相当有据可查,有例子。

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);