OC06 数组高级

//  Student.h

#import <Foundation/Foundation.h>


@interface Student : NSObject

{

    NSString *_name;

    int _ID;

    int _age;

}



// 声明一个便利构造器

+ (instancetype)studentWithName: (NSString *)name

                             ID: (int)ID

                            age: (int)age;



    //使用数组方法排序:按年龄降序排序

    - (NSComparisonResult)comperByAgeDown: (Student *)stu1;// 与数组元素同类型,所以(Student *)stu1



    //使用数组方法排序:按ID升序排序

    - (NSComparisonResult)comperByIDUp:(Student *)stu1;


    // 






    //namegetter方法

- (NSString *)name;






@end



//  Student.m


#import "Student.h"


@implementation Student

//自定义初始化方法

- (instancetype)initWithName: (NSString *)name

                          ID: (int)ID

                         age: (int)age{

    self = [super init];//

    if (self) {

        _name = name;

        _ID = ID ;

        _age = age;

    }return self;

}



// 实现自定义初始化方法,用于调用

- (NSString *) description{

    return [[NSString alloc] initWithFormat:@"name:%@,ID:%d,age:%d", _name, _ID, _age];

}





// 实现便利构造器

+ (instancetype)studentWithName: (NSString *)name

                        ID: (int)ID

                           age: (int)age{

    

    Student *stu = [[Student alloc] initWithName:name ID:ID age:age];//调用自定义初始化方法

    return stu;

}











//使用数组方法排序:按年龄降序排序

- (NSComparisonResult)comperByAgeDown: (Student *)stu1{

    // 需求是完成降序排列,如果前一个元素小于后一个元素,则需要返回降序,让sortedArrayUsingSelector:方法交换两个元素的位置

    if (_age < stu1->_age) {

        return NSOrderedDescending;

    } else if(_age > stu1->_age){

        return NSOrderedAscending;

    } else

        return NSOrderedSame;

}



//使用数组方法排序:按ID升序排序

- (NSComparisonResult)comperByIDUp:(Student *)stu1{

    if (_ID > stu1->_ID) {

        return NSOrderedDescending;

    } else if(_ID < stu1->_ID){

        return NSOrderedAscending;

    } else

        return NSOrderedSame;

}






//namegetter方法

- (NSString *)name{

    return _name;

}



@end



//  main.m

#import <Foundation/Foundation.h>

#import "Student.h"



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


    

#pragma mark -通过便利构造器方法创建4个学生对象

    Student *stu1 = [Student studentWithName:@"jjj" ID:10 age:18];

    Student *stu2 = [Student studentWithName:@"kkk" ID:15 age:20];

    Student *stu3 = [Student studentWithName:@"bbb" ID:23 age:19];

    Student *stu4 = [Student studentWithName:@"sss" ID:77 age:22];

    

    

    //4个学生对象存进数组(使用字面量)

    NSArray *stuArray = @[stu1, stu2, stu3, stu4];

    

    

    //使用数组方法排序:

    NSArray *sortedArray1 = [stuArray sortedArrayUsingSelector:@selector(comperByAgeDown:)];

    NSLog(@"%@", sortedArray1);

    

    //ID升序排序

    NSArray *sortedArray2 = [stuArray sortedArrayUsingSelector:@selector(comperByIDUp:)];

    NSLog(@"%@", sortedArray2);


    //按姓名jiang序排序  (类型转换解决代码不提示问题,前提是相同类型)

    NSArray *nameDownArray = [stuArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){

        // obj1,obj2由泛型转换为Student类型

        Student *stu1 = (Student *)obj1;

        Student *stu2 = (Student *)obj2;

        if ([[stu1 name] compare: [stu2 name]] == -1) {

            return NSOrderedDescending;

        }else if([[stu1 name] compare: [stu2 name]] == 1){

            return NSOrderedAscending;

        }else

            return NSOrderedSame;

        

    }];

    

    NSLog(@"%@", nameDownArray);


    

    

#pragma mark --字面量

    // 字面量方法创建对象(只有系统提供了字面量方法的类才能使用字面来创建对象,否则不能使用)

    // 字面量语法只有不可变对象有,因为使用字面量创建出来的对象值都保存在常量区,常量区的内容不能被修改。

    

    // 数组的字面量方法:

    NSArray *arr = @[@12, @23, @34, @"hello"];

    // 数组使用字面量的方法来访问元素:数组名+下标的方式

    NSLog(@"%@", arr[3]);

    

    // 字典字面量创建方法:冒号前是key,冒号后是value,每个键值对之间使用逗号分隔

    NSDictionary *dict = @{@"a" : @"1",

                           @"b" : @"2",

                           @"c" : @"3"};

    // 字典使用字面量的方法取值

    NSLog(@"%@", dict[@"b"]);

    

    // NSnumber的字面量创建方法:@+要转换为NSNumber类型的数

    NSNumber *intNum = @12;

    NSNumber *floatNum = @12.23;

    

    

    // NSStringde 字面量创建方法

    NSString *str = @"hahaha";

    

    NSLog(@"%p, %p, %p, %p, %p",arr, dict, intNum, floatNum, str );

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

//    NSComparisonResult (^myblock)(id,id) = ^(id obj1, id obj2){

//        if (obj1 > obj2) {

//            return NSOrderedAscending;

//        }else

//            return NSOrderedDescending;

//    };

//    

//    

//    [stuArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

//        if (obj1 > obj2) {

//            return NSOrderedAscending;

//        }else

//            return NSOrderedDescending;

//    }];

//    NSLog(@"%@", myblock);

//    

//    

//    

//    NSArray *array = @[@1, @12, @23, @32];

//    // 定义一个block变量,存放实现升序排列数组元素的规则代码

//    NSComparisonResult (^sortArrayBlock)(id, id) = ^(id a, id b){

//        if (a > b) {

//            return NSOrderedDescending;

//        }else if (a < b){

//            return NSOrderedAscending;

//        }else

//            return NSOrderedSame;

//    };

//    

//    // 调用block

    NSArray *sortUpArray = [array sortedArrayUsingComparator:sortArrayBlock];

//    NSArray *sortUpArray = [stuArray sortedArrayUsingComparator:^NSComparisonResult(id  obj1, id  obj2) {

//        // 因为id是泛型,所以这里为了保证类型安全,要将对象从泛型转换为指定类型

//        NSNumber *num1 = (NSNumber *)obj1;

//        NSNumber *num2 = (NSNumber *)obj2;

//        if (num1 > num2) {

//            return NSOrderedAscending;

//        }else if(num1 < num2){

//            return NSOrderedDescending;

//        }else

//            return NSOrderedSame;

//    }];

//

//    NSLog(@"%@", sortUpArray);

//    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    return 0;

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值