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