2010-10-13 100 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); 
相關問題