我有一個包含以下屬性如何根據對象的屬性對數組進行排序?
-name
-id
-type (question, topic or user)
我如何排序這個數組通用對象的基於通用對象的類型「通用對象」的NSArray的?例如。我想在頂部顯示'主題'類型的所有通用對象,然後是'用戶'而不是'問題'
我有一個包含以下屬性如何根據對象的屬性對數組進行排序?
-name
-id
-type (question, topic or user)
我如何排序這個數組通用對象的基於通用對象的類型「通用對象」的NSArray的?例如。我想在頂部顯示'主題'類型的所有通用對象,然後是'用戶'而不是'問題'
您需要定義一個自定義排序函數,然後將其傳遞給允許自定義的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
陣列。
您也可以使用NSArray的'sortedArrayUsingComparator:'方法,它將塊作爲參數。這樣可以避免需要編寫自定義函數,因爲您可以在塊中放入相同的比較代碼。 – 2012-01-09 03:03:13
@AndrewMadsen:很好,謝謝!在NSArray上實際上有一個類似的比較函數(好的,五個) - 我非常隨意地選擇了這個函數。珍:用你最舒服的方式。 – Tim 2012-01-09 03:05:06
這已經被回答了幾次:[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
這個問題可能有你的答案:[鏈接](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it) – jonkroll 2012-01-09 02:49:30
謝謝,但在我的情況下,我想特別推動所有類型=主題的對象頂部,所以我不能真正使用升序或降序排序在這種情況下,我想。我怎樣才能做到這一點? – Zhen 2012-01-09 02:58:30