OC06 数组高级

来源:互联网 发布:nfc读卡软件 编辑:程序博客网 时间:2024/05/29 14:54

//  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 = [superinit];//

   if (self) {

       _name = name;

       _ID = ID ;

       _age = age;

    }return self;

}



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

- (NSString *) description{

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

}





// 实现便利构造器

+ (instancetype)studentWithName: (NSString *)name

                        ID: (int)ID

                           age: (int)age{

    

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

   return stu;

}











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

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

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

   if (_age < stu1->_age) {

        returnNSOrderedDescending;

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

        returnNSOrderedAscending;

    }else

        returnNSOrderedSame;

}



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

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

   if (_ID > stu1->_ID) {

        returnNSOrderedDescending;

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

        returnNSOrderedAscending;

    }else

        returnNSOrderedSame;

}






//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 = [StudentstudentWithName:@"jjj"ID:10 age:18];

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

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

   Student *stu4 = [StudentstudentWithName:@"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) {

            returnNSOrderedDescending;

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

            returnNSOrderedAscending;

        }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