OC学习之道:关于数组的四种排序

//  Copyright (c) 2015年 童星. All rights reserved.
//  Person.h

#import 
   
   
    
    

@interface Person : NSObject{
    int _age;
    NSString *_name;
}
//set方法main.m
-(void)setAge:(int)age;
-(void)setName:(NSString *)name;
//get方法
-(int)age;
-(NSString *)name;
//自定义初始化方法
-(id)initWithName:(NSString *)name Age:(int)age;
//自定义构造器
+(id)personWithName:(NSString *)name Age:(int)age;
//自定义排序方法
-(NSComparisonResult)comparePerson:(Person *)person;

//显示全部信息
-(void)showInfo;
@end
//  Copyright (c) 2015年 tongxing. All rights reserved.
//  Person.m

#import "Person.h"

@implementation Person
-(void)setAge:(int)age{
    _age = age;
}
-(void)setName:(NSString *)name{
    _name = name;
}
-(int)age{
    return  _age;
}
-(NSString *)name{
    return  _name;
}
-(id)initWithName:(NSString *)name Age:(int)age{
    if (self = [super init]) {
        _age = age;
        _name = name;
    }
    return  self;
}
+(id)personWithName:(NSString *)name Age:(int)age{
    Person *person = [[Person alloc]initWithName:name Age:age];
    return person;
}

//自定义排序方法
-(NSComparisonResult)comparePerson:(Person *)person{
    //默认按年龄排序
    NSComparisonResult result = [ [NSNumber numberWithInt:self.age] compare:[NSNumber numberWithInt:person.age]];//注意,基本数据类型要进行数据转换???1.默认的是升序还是降,2.类型转换.因为age不是对象,需要转化为number对象
    //如果年龄一样,就按姓名排序
    if (result == NSOrderedSame) {
        result =[self.name compare:person.name];//替换compare前后的内容,可是实现不同的排序方式
        self.age是取得传过来的第一个对象,student.age代表传过来的第二个对象,交换过程在系统内部实现
    }
    return result;
    


}

-(void)showInfo{
    NSLog(@"%@,%d",_name,_age);

}


//重写父类的description方法
-(NSString *)description{
    NSString * str =[NSString stringWithFormat:@"姓名:%@,年龄:%d",_name,_age];
     return str;
}
@end
//  Copyright (c) 2015年 tongxing. All rights reserved.
//main.m
#pragma mark---sortedArrayUsingSelector:系统自带数组简单排序
void sortArray1(){
    NSArray *array1 = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];
    //返回一个排好序的数组,原来的数组元素顺序不变,
    //使用指定元素的比较方法
    NSArray *sortedArray = [array1 sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序后:%@",sortedArray);
 
}
#pragma mark---sortedArrayUsingSelector:自定义compare:数组简单排序
void sortArray2(){
    Person *person1 =[Person personWithName:@"liuyifei" Age:26];
    Person *person2 =[Person personWithName:@"tongxing" Age:23];
    Person *person3 =[Person personWithName:@"zhoudongyu" Age:43];
    Person *person4 =[Person personWithName:@"zhangfei" Age:23];
    //使用指定的自定义排序的比较方法
    NSArray *array2 =[NSArray arrayWithObjects:person1,person2,person3,person4,nil];
    //调用排序函数
    NSArray *array3 =[array2 sortedArrayUsingSelector:@selector(comparePerson:)];
  //输出排序后的元素
    for (int i=0; i<[array3 count]; i++) {
     // NSLog(@"%@",array3[i]);
/*此处如果使用该种方式进行输出,那么打印出来的将会是以地址的形式显示,因为%@格式相当于调用父类的description方法,
 无法输出我们需要的格式,所以如果想打印出全部信息,呢么就需要在自定义类Person里重写父类的description方法,*/
        Person *person = [array3 objectAtIndex:i];
        [person showInfo];
    }
 

}

#pragma mark---sortedArrayUsingComparator:利用block进行排序
void sortArray3(){
    Person *person1 =[Person personWithName:@"liuyifei" Age:26];
    Person *person2 =[Person personWithName:@"tongxing" Age:23];
    Person *person3 =[Person personWithName:@"zhoudongyu" Age:43];
    Person *person4 =[Person personWithName:@"zhangfei" Age:23];
    //使用指定的自定义排序的比较方法
    NSArray *array2 =[NSArray arrayWithObjects:person1,person2,person3,person4,nil];
    NSArray *array4 = [array2 sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) {
    //先按照年龄排序,进行数据转化
    NSComparisonResult result =[[NSNumber numberWithInt:p1.age ] compare:[NSNumber numberWithInt:p2.age ]];
    if (result==NSOrderedSame) {
        //年龄一样再按照姓名排序
        result =[p1.name compare:p2.name];
    }
    return result;
}];
    //输出排序后的元素
    for (int i=0; i<[array4 count]; i++) {
        // NSLog(@"%@",array3[i]);
                //此处输出同sortArray2()处一样
        Person *person = [array4 objectAtIndex:i];
        [person showInfo];
    }
  //  NSLog(@"%@",array4);
}

#pragma mark---:高级排序
void sortArray4(){
    Person *person1 =[Person personWithName:@"liuyifei" Age:26];
    Person *person2 =[Person personWithName:@"tongxing" Age:23];
    Person *person3 =[Person personWithName:@"zhoudongyu" Age:43];
    Person *person4 =[Person personWithName:@"zhangfei" Age:23];
    //使用指定的自定义排序的比较方法
    NSArray *array2 =[NSArray arrayWithObjects:person1,person2,person3,person4,nil];
    //先按照年龄排序,
    NSSortDescriptor *ageDesc =[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
    //再按照姓名排序
    NSSortDescriptor *nameDesc =[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSArray  *desc =[NSArray arrayWithObjects:ageDesc,nameDesc,nil];
    NSArray *array3 = [array2 sortedArrayUsingDescriptors:desc];
    //输出排序后的元素
    for (int i=0; i<[array3 count]; i++) {
        // NSLog(@"%@",array3[i]);//若要使用NSLog,此处必须重写父类description方法才能显示出全部信息

        Person *person = [array3 objectAtIndex:i];
        [person showInfo];
    }
    


}



int main(int argc, const char * argv[])
{

    @autoreleasepool {
    
    #pragma mark---sortedArrayUsingSelector:数组简单排序/block排序和高级排序
     
        sortArray1();
        sortArray2();
        sortArray3();    
        sortArray4();

       
    }
    return 0;
}

   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值