數組元素類型
假設我們這個數組里面的元素是一個 model 類型,比如 CHSAssetGroup,其CHSAssetGroup.h
文件內容如下:
@interface CHSAssetGroup : NSObject
@property (nonatomic, copy) NSString *name; // 名字
@property (nonatomic, copy) NSString *creationDate; // 日期
CHSAssetGroup 有兩個屬性,第一個是名字,第二個創建日期
數組排序的 key
現在我們創建一個數組,里面有 3 個 CHSAssetGroup
類型的對象:
CHSAssetGroup *group_a = [[CHSAssetGroup alloc] init];
group_a.name = @"a";
group_a.creationDate = @"2016-5-28";
CHSAssetGroup *group_b = [[CHSAssetGroup alloc] init];
group_b.name = @"b";
group_b.creationDate = @"2016-8-23";
CHSAssetGroup *group_c = [[CHSAssetGroup alloc] init];
group_c.name = @"c";
group_c.creationDate = @"2016-6-21";
NSArray *array = @[group_a, group_b, group_c];
現在我們要讓數組里面的元素按照 CHSAssetGroup
的 creationDate
降序排序,代碼如下:
// Key: 按照排序的key; ascending: YES為升序, NO為降序。
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sorter count:1];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"%@", sortedArray);
NSSortDescriptor 指定用于對象數組排序的對象的屬性。sortedArray 即為排序后的數組,其元素順序為 @[group_b, group_c, group_a];
如果是要求對象按照多可 key 排序,比如先按 name 排序,再按 creationDate 排序。那就創建兩個descriptor,將兩個 descriptor 放到數組里一起傳給需要排序的數組。
NSSortDescriptor *nameSorter = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];
NSSortDescriptor *dateSorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors2 = [[NSArray alloc] initWithObjects:nameSorter, dateSorter, nil];
可變數組排序
如果想要排序的數組是一個可變數組,則只需要調用 sortUsingDescriptors:
方法對自身進行排序即可:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:group_a, group_b, group_c, nil];
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sorter count:1];
[mutableArray sortUsingDescriptors:sortDescriptors]
NSLog(@"%@", mutableArray);
字符串數組排序
如果對象就是NSString,就是字符串數組排序,這就更加簡單了,將 sortdescriptor
的 key 直接指定為 nil,就直接排序對象,而不是對象的某一個屬性了。
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:descriptor];
NSArray *myDataArray = [NSArray arrayWithObjects:@"what", @"xman", @"highligth", @"mountain", @"success", @"Apple", nil];
NSArray *sortedArray = [myDataArray sortedArrayUsingDescriptors:descriptors];
NSLog(@"%@", sortedArray);