1、NSSortDescriptor排序
概述:
數組是有序容器,因此集合中只有數組才能排序。該類能夠方便的實現對數組中的對象進行升序或者降序的排序。它可以把元素的某個屬性作為key進行升序或降序的排序,每個NSSortDescriptor對象就是一個排序條件。
NSSortDescriptor初始化方法
- (instancetype)initWithKey:(NSString *)key ascending:(BOOL)ascending;
key:按照數組中對象的哪個屬性進行排序,如果數組中存放的是能夠直接排序的對象(比如:字符串),直接使 @"self" 或者 nil 即可;如果存放的是自定義類的對象,使用想要進行排序的屬性名即可(比如:想按照Person類的name進行排序, 使用 @"name" 作為參數)。ascending:排序的標志,是升序還是降序。 YES - 升序, NO - 降序。
NSSortDescriptor創建
NSSortDescriptor *sortDes1 = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; // 升序
NSSortDescriptor *sortDes2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; // 降序
① 不可變數組排序
// 基本數據類型不可變數組
array = [array sortedArrayUsingDescriptors:@[sortDes1]];
NSLog(@"%@", array);
// 自定義對象不可變數組
// 按照名字排序
personArray = [personArray sortedArrayUsingDescriptors:@[sortDes2]];
NSLog(@"%@", personArray);
② 可變數組排序
// 基本類型可變數組
[mArray sortUsingDescriptors:@[sortDes1]];
NSLog(@"%@", mArray);
// 自定義對象可變數組
// 按照名字排序
[personMArray sortUsingDescriptors:@[sortDes2]];
NSLog(@"%@", personMArray);
2、使用數組中 兩個元素比較的方法名 進行排序
① 不可變數組排序:(排序結果生成新數組, 原數組無改變)
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
注:SEL類型的參數comparator:需要傳入一個返回結果是NSComparisonResult的方法名。
// 可變數組(基本數據類型)
[mArray sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArray);
// 可變的數組(自定義類型的對象)
// 按照名字排序
[personMArray sortUsingSelector:@selector(compareByName:)];
NSLog(@"%@", personMArray);
② 可變數組排序:(直接對原數組操作,無新數組生成)
- (void)sortUsingSelector:(SEL)comparator;
注:SEL類型的參數comparator:需要傳入一個返回結果是NSComparisionResult的函數
// 可變數組(基本數據類型)
[mArray sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArray);
// 可變的數組(自定義類型的對象)
// 按照名字排序
[personMArray sortUsingSelector:@selector(compareByName:)];
NSLog(@"%@", personMArray);
Person類中compareByName方法:
// 比較方法的聲明
- (NSComparisonResult)compareByName:(Person *)anotherPerson;
// 比較方法的實現
- (NSComparisonResult)compareByName:(Person *)anotherPerson
{
return [self.name compare:anotherPerson.name];
}
上面方法排完序后返回的數組英文和漢字是分開的,所以如需將漢字也排入英文中,請參考:https://github.com/lingxuemy/XCompareString.git