簡(jiǎn)單說(shuō)明
數(shù)組排序比較多坡疼,我們講一種比較常用的,這里涉及到一個(gè)知識(shí)點(diǎn):
NSComparisonResult:
typedef enum NSComparisonResult : NSInteger {
NSOrderedAscending = -1L,
NSOrderedSame,
NSOrderedDescending
} NSComparisonResult;
文檔解釋
NSOrderedAscending:左邊數(shù)據(jù)比右邊小柄沮,可理解成增序
NSOrderedSame:相等
NSOrderedDescending:左邊數(shù)據(jù)比右邊大回梧,可理解成降序
示例:
NSArray *array = @[@"Benz",@"BMW",@"Ferrari",@"Lamborghini"];
1、普通排序系統(tǒng)自帶的升序
NSArray *sortedArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"普通排序:%@",sortedArray1);
2祖搓、逆轉(zhuǎn)數(shù)組
NSArray *sortedArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
//逆轉(zhuǎn)
return NSOrderedDescending;
}];
NSLog(@"逆轉(zhuǎn)數(shù)組:%@",sortedArray2);
3狱意、不逆轉(zhuǎn)(相當(dāng)于原數(shù)組)
NSArray *sortedArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
//不逆轉(zhuǎn)
return NSOrderedAscending;
}];
NSLog(@"不逆轉(zhuǎn)(原數(shù)據(jù)):%@",sortedArray3);
4、 升序排列
NSArray *sortedArray4 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
//升序
NSComparisonResult result = [obj1 compare: obj2];
return result;
}];
NSLog(@"升序排列:%@",sortedArray4);
5拯欧、降序排列
NSArray *sortedArray5 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//降序
NSComparisonResult result = [obj1 compare: obj2];
return -result;
}];
NSLog(@"降序排列:%@",sortedArray5);
輸出結(jié)果
進(jìn)階:
數(shù)組里面存放模型详囤,根據(jù)模型的某個(gè)屬性值來(lái)對(duì)數(shù)組進(jìn)行重新排序
1)、初始化一些車輛和數(shù)組:
Car *benz = [Car new];
benz.name = @"Benz";
benz.price = 2000.0;
Car *bmw = [Car new];
bmw.name = @"BMW";
bmw.price = 800;
Car *ferrari = [Car new];
ferrari.name = @"Ferrari";
ferrari.price = 1200;
Car *lamborghini = [Car new];
lamborghini.name = @"Lamborghini";
lamborghini.price = 12000;
NSMutableArray *array = @[benz,bmw,ferrari,lamborghini].mutableCopy;
2)镐作、排序方法
/**
對(duì)數(shù)組里存放model的某個(gè)屬性對(duì)數(shù)組進(jìn)行重新排序
@param array 待排序數(shù)組
@param increase 是否增序排列
@param key 屬性
@return <#return value description#>
*/
-(NSArray *)sortArray:(NSArray *)array increase:(BOOL)increase byKey:(NSString *)key{
array = [array sortedArrayUsingComparator:
^NSComparisonResult(Car *obj1, Car *obj2) {
NSComparisonResult result;
if ([key isEqualToString:@"price"]) {
CGFloat res1 = [[obj1 valueForKey:key] floatValue];
CGFloat res2 = [[obj2 valueForKey:key] floatValue];
if (increase) {
if (res1 < res2){
result = NSOrderedAscending;
}else {
result = NSOrderedDescending;
}
} else {
if (res1 < res2){
result = NSOrderedDescending;
}else {
result = NSOrderedAscending;
}
}
} else {
result = [[obj1 valueForKey:key] compare:[obj2 valueForKey:key]];
if (!increase) {
if (result == NSOrderedDescending) {
result = NSOrderedAscending;
} else if (result == NSOrderedAscending) {
result = NSOrderedDescending;
}
}
}
return result;
}].mutableCopy;
return array;
}
3)藏姐、打印結(jié)果
NSArray *sortArray;
sortArray = [self sortArray:array increase:YES byKey:@"price"];
NSLog(@"increase by price:");
for (Car *c in sortArray) {
NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}
NSLog(@"------分割線------");
sortArray = [self sortArray:array increase:NO byKey:@"price"];
NSLog(@"descend by price:");
for (Car *c in sortArray) {
NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}
NSLog(@"------分割線------");
sortArray = [self sortArray:array increase:YES byKey:@"name"];
NSLog(@"increase by name:");
for (Car *c in sortArray) {
NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}
NSLog(@"------分割線------");
sortArray = [self sortArray:array increase:NO byKey:@"name"];
NSLog(@"descend by name:");
for (Car *c in sortArray) {
NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}
輸出結(jié)果
Warnning:可能有眼尖的看客發(fā)現(xiàn)了,increase by name
和descend by name
順序不對(duì)该贾,升序的時(shí)候Benz不應(yīng)該在BMW前面嗎羔杨?降序Benz在BMW后面嗎?注意杨蛋,這里M是大寫(xiě)兜材,而e是小寫(xiě)理澎,大寫(xiě)的ASCII碼在小寫(xiě)前面,所以M比e前曙寡。