// 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;
//
//name的getter方法
- (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;
}
//name的getter方法
- (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;
}