Pre:很多文章對于SEL排序講解太過含糊辛块,特寫此文講述清楚畔派。
官方提供了幾個api進(jìn)行數(shù)組排序操作,開發(fā)者只需提供兩個元素的比較規(guī)則润绵,而無需關(guān)心元素在數(shù)組中是如何移動直至全部有序化线椰。
首先看下面的2個定義。對typedef
的更多使用參考這里授药。
1.定義NSComparisonResult類型返回值
typedef NS_ENUM(NSInteger, NSComparisonResult)
{
//代表升續(xù)
NSOrderedAscending = -1L,
//代表相同
NSOrderedSame,
//代表降序
NSOrderedDescending
};
2.定義NSComparator block類型返回值
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
注意:NSArray的排序方法是生成一個排好序的新數(shù)組士嚎。NSMutableArray的排序可以直接對該數(shù)組進(jìn)行排序sortUsingComparator:
,也可以生成新數(shù)組sortedArrayUsingComparator:
悔叽,而原數(shù)組不變莱衩。
1.使用block進(jìn)行排序(推薦使用)
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@2];
[arr addObject:@1];
[arr addObject:@5];
[arr addObject:@3];
[arr addObject:@4];
//此方法是直接對arr排序,若要生成新數(shù)組排序則調(diào)用sortedArrayUsingComparator:
//若明確知道數(shù)組中元素的類型娇澎,也可以直接將id改為某確定類型
[arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2)
{
//此處的規(guī)則含義為:若前一元素比后一元素小笨蚁,則返回降序(即后一元素在前,為從大到小排列)
if ([obj1 integerValue] < [obj2 integerValue])
{
return NSOrderedDescending;
}
else
{
return NSOrderedAscending;
}
}];
排序結(jié)果為 5趟庄,4括细,3,2戚啥,1
2.使用SEL排序
NSMutableArray *arr = [NSMutableArray array];
for (NSInteger i = 0; i < 5; i++)
{
Student *stu = [Student new];
//生成10-20的隨機(jī)數(shù)
stu.age = arc4random_uniform(10) + 10;
[arr addObject:stu];
}
//此處的sel應(yīng)該理解為對數(shù)組中A對象調(diào)用自己的sel奋单,傳入值為B對象,同時返回值為NSComparisonResult
[arr sortUsingSelector:@selector(compareWithStu:)];
Student對象必須有一個自定義比較方法進(jìn)行排序猫十。此方法必須有一個傳入值(傳入Student對象用以比對)和一個返回值(NSComparisonResult類型)览濒。
Student具體如下
.h
@interface Student : NSObject
@property (assign, nonatomic) NSInteger age;
/** 排序規(guī)則*/
- (NSComparisonResult)compareWithStu:(Student *)stu;
@end
.m
@implementation Student
/** 排序規(guī)則*/
- (NSComparisonResult)compareWithStu:(Student *)stu
{
//按照升續(xù)排列
if (self.age > stu.age)
{
return NSOrderedDescending;
}
else if (self.age == stu.age)
{
return NSOrderedSame;
}
else
{
return NSOrderedAscending;
}
}
@end
某次運(yùn)行結(jié)果為
(
"age -> 10",
"age -> 12",
"age -> 12",
"age -> 18",
"age -> 19"
)
寫在最后:
1.排序是一個消耗性能的操作呆盖,應(yīng)盡量避免頻繁排序。
2.對于已經(jīng)排好序的數(shù)組再排序可以使用sortedArrayHint
進(jìn)行性能優(yōu)化贷笛。在排序進(jìn)階篇會補(bǔ)上相關(guān)內(nèi)容应又。
3.對于數(shù)組中對象是NSString
的排序推薦使用第二種方案,因為NSString
已經(jīng)有了排序方案如compare:
方法已經(jīng)是按照升序排列了乏苦。關(guān)于NSString
的排序內(nèi)容很多株扛,另一篇填此坑。
4.對于排序還有一些高級用法汇荐,會在下一遍詳細(xì)說明洞就。