OC中排序的方法实例分析:
下面是.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;//姓名
NSInteger _age;//年龄
CGFloat _height;//身高
}
//_name
- (void)setName:(NSString *)name;
- (NSString *)name;
//_age
- (void)setAge:(NSInteger)age;
- (NSInteger)age;
//height
- (void)setHeight:(CGFloat)height;
- (CGFloat)height;
//重写description
- (id)description;
//自定义初始化方法
- (id)initWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height;
//compare 比较方法
- (NSComparisonResult)compareByAge:(Person *)anotherPerson;
- (NSComparisonResult)compareByHeight:(Person *)anotherPerson;
- (NSComparisonResult)compareByName:(Person *)anotherPerson;
//按姓名降序排列
- (NSComparisonResult)compareByNameDes:(Person *)anotherPerson;
下面是.m文件
<pre name="code" class="cpp">#import "Person.h"
@implementation Person
#pragma mark - setter and getter
//_name
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
//_age
- (void)setAge:(NSInteger)age
{
_age = age;
}
- (NSInteger)age
{
return _age;
}
//height
- (void)setHeight:(CGFloat)height
{
_height = height;
}
- (CGFloat)height
{
return _height;
}
#pragma mark - override methon
- (id)description
{
return [NSString stringWithFormat:@"%@ %ld %g",_name,_age,_height];
}
#pragma mark - init mentod
- (id)initWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height
{
self = [super init];
if (self) {
_name = name;
_age = age;
_height = height;
}
return self;
}
#pragma mark - compare
//compare 比较方法
- (NSComparisonResult)compareByAge:(Person *)anotherPerson
{
if ([self age] > [anotherPerson age]) {
return NSOrderedDescending;// 1
}else if([self age] == [anotherPerson age]){
return NSOrderedSame;// 0
}else{
return NSOrderedAscending;// -1
}
}
- (NSComparisonResult)compareByHeight:(Person *)anotherPerson
{
if ([self height] > [anotherPerson height]) {
return NSOrderedDescending;//1
}else if ([self height] == [anotherPerson height]){
return NSOrderedSame;//0
}else{
return NSOrderedAscending;//1
}
}
- (NSComparisonResult)compareByName:(Person *)anotherPerson
{
// if ([[self name] compare:[anotherPerson name]] == 1 ) {
// return NSOrderedDescending;//1
// }else if ([[self name]compare:[anotherPerson name]] == 0 ){
// return NSOrderedSame;//0
// }else{
// return NSOrderedAscending;//-1
// }
return [[self name] compare:[anotherPerson name]];//1 0 -1
}
//降序
- (NSComparisonResult)compareByNameDes:(Person *)anotherPerson
{
return -[[self name] compare:[anotherPerson name]];
}
@end
以下是main.m文件
<pre name="code" class="cpp">#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Person *per1 = [[Person alloc]initWithName:@"xiaoguang" age:20 height:175];
// Person *per2 = [[Person alloc]initWithName:@"xiaomeng" age:25 height:163];
// Person *per3 = [[Person alloc]initWithName:@"dapeng" age:18 height:182];
// Person *per4 = [[Person alloc]initWithName:@"dachui" age:35 height:165];
// NSArray *arr = [[NSArray alloc]initWithObjects:per1,per2,per3,per4, nil];
// //对数组中对象按姓名升序排序
// NSArray *sortArrName = [arr sortedArrayUsingSelector:@selector(compareByName:)];
// NSLog(@"%@",sortArrName);
// //............年龄
// NSArray *sortArrAge = [arr sortedArrayUsingSelector:@selector(compareByAge:)];
// NSLog(@"%@",sortArrAge);
// //.............身高
// NSArray *sortArrHeight = [arr sortedArrayUsingSelector:@selector(compareByName:)];
// NSLog(@"%@",sortArrHeight);
// //对数组中对象按姓名降序排序
// NSArray *sortArrNameDes = [arr sortedArrayUsingSelector:@selector(compareByNameDes:)];
// NSLog(@"%@",sortArrNameDes);
NSArray *arr = [[NSArray alloc]initWithObjects:@"aa",@"bb",@"cc",@"dd",@"ee",@"ff", nil];
//1.对数组进行升序排序
//sortedArrayUsingSelector 排序方式的使用场景:适用于升序排序以及自定义的类的排序
NSArray *sortArrAscending = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",sortArrAscending);
//2.对数组进行降序排列
//block的排序方法使用场景:适用于当数组中的对象类型是系统类型时,并且要降序排序
NSArray *sortArrDes1 = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//对block匿名函数实现,比较方法
//1.将id类型转为nssstring *;
NSString *str1 = (NSString *)obj1;
NSString *str2 = (NSString *)obj2;
//2.字符串比较
return -[str1 compare:str2];
}];
NSLog(@"%@",sortArrDes1);
本文主要包含了对name age height 的升序降序排列 其中block 以及 -[str compare:] 注意仔细体会