2012-01-09 320 views
2

我有一個包含以下屬性如何根據對象的屬性對數組進行排序?

-name 
-id 
-type (question, topic or user) 

我如何排序這個數組通用對象的基於通用對象的類型「通用對象」的NSArray的?例如。我想在頂部顯示'主題'類型的所有通用對象,然後是'用戶'而不是'問題'

+0

這已經被回答了幾次:[here](http://stackoverflow.com/questions/1351182/how-to-sort-a-nsarray-alphabetically),[here](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray -with-custom-objects-in-it)和[here](http://stackoverflow.com/questions/1844031/how-to-sort-nsmutablearray例如,使用描述符的使用排序的陣列)。 – user1118321 2012-01-09 02:48:07

+0

這個問題可能有你的答案:[鏈接](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it) – jonkroll 2012-01-09 02:49:30

+0

謝謝,但在我的情況下,我想特別推動所有類型=主題的對象頂部,所以我不能真正使用升序或降序排序在這種情況下,我想。我怎樣才能做到這一點? – Zhen 2012-01-09 02:58:30

回答

5

您需要定義一個自定義排序函數,然後將其傳遞給允許自定義的NSArray方法排序。例如,使用sortedArrayUsingFunction:context:,你可能會寫(假設你的類型的NSString實例):

NSInteger customSort(id obj1, id obj2, void *context) { 
    NSString * type1 = [obj1 type]; 
    NSString * type2 = [obj2 type]; 

    NSArray * order = [NSArray arrayWithObjects:@"topic", @"users", @"questions", nil]; 

    if([type1 isEqualToString:type2]) { 
     return NSOrderedSame; // same type 
    } else if([order indexOfObject:type1] < [order indexOfObject:type2]) { 
     return NSOrderedDescending; // the first type is preferred 
    } else { 
     return NSOrderedAscending; // the second type is preferred 
    } 
} 

// later... 

NSArray * sortedArray = [myGenericArray sortedArrayUsingFunction:customSort 
                 context:NULL]; 

如果你的類型不NSString的,然後根據需要只適應的功能 - 你可以在order陣列替換字符串與您的實際對象或(如果您的類型是枚舉的一部分)進行直接比較並完全消除order陣列。

+2

您也可以使用NSArray的'sortedArrayUsingComparator:'方法,它將塊作爲參數。這樣可以避免需要編寫自定義函數,因爲您可以在塊中放入相同的比較代碼。 – 2012-01-09 03:03:13

+0

@AndrewMadsen:很好,謝謝!在NSArray上實際上有一個類似的比較函數(好的,五個) - 我非常隨意地選擇了這個函數。珍:用你最舒服的方式。 – Tim 2012-01-09 03:05:06

相關問題