// main.m
#import <Foundation/Foundation.h>
#import "person.h"
int main(int argc, const char * argv[]) {
//数组遍历
//原理:通过for循环的循环变量⽤用作数组元素下标来获取不同下标的 元素。
// 循环次数就是数组元素的个数。:
// NSArray *cityarray=[NSArray arrayWithObjects:@"北京",@"河北",@"山西",@"山东",@"河南", nil];
// //字典:
// NSDictionary *nsdic=[NSDictionary dictionaryWithObjectsAndKeys:@"张三",@"name",@"18",@"age",@"吃饭",@"hobby", nil];
//
// //集合:
// NSSet *string=[NSSet setWithObjects:@"123",@"345",@"2356",@"789", nil];
//
// //原理:通过for循环的循环变量⽤用作数组元素下标来获取不同下标的 元素。
// //循环次数就是数组元素的个数。
//
//
// for (int i=0; i<cityarray.count; i++) {
// //根据下标从数组中取出对应下标的元素
// NSString *string=[cityarray objectAtIndex:i];
//
// NSLog(@"[%d]:%@",i,string);
// }
//
//
// //字典遍历
// //原理:先获取字典中所有的key,存储到数组中,遍历数组依次取 出每⼀一个key,然后根据key从字典中取出对应的value。 字典取值要通过key取出对应的value。 循环次数等于字典的元素个数。
//
//
// NSArray *keys=[nsdic allKeys];//取出nsdic当中所有的key值(存储到数组当中)
//
// for (int i=0; i<keys.count; i++) {
// //通过数组元素下标 取出对应的key
// NSString *key=[ keys objectAtIndex:i];
// //在通过key取出对应的value
// NSLog(@"%@:%@",key, [nsdic objectForKey:key]);
//
//
// }
//
//
// //集合:
// // 原理: ⽤用集合的allObject属性先取到集合的所有元素存储到数组
//
// //中,再通过for循环的循环变量⽤用作下标来取到每个元素。
//
//
// NSArray *setobject=[string allObjects];
// for (int i=0; i<setobject.count; i++) {
// //从集合的allObjects(allObjects数组)中获取对应下标搜对应的元素,并输出
//
// NSLog(@"%@",[setobject objectAtIndex:i]);
//
//
// }
/*使⽤用for循环完成:
定义⼀一个数组, 包含5个字符串对象, 倒序取出数组中所 有元素, 并存储到另⼀一可变数组中。
*/
//
// NSArray *arr=[NSArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",@"ee", nil];
//
// NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];
// int j=0;
// for (NSInteger i=arr.count-1; i<arr.count; i--) {
//
// array[j]=arr[i];
// j++;
// }
//
// NSLog(@"%@",array);
//
//
//
/*
使⽤用for循环完成:
定义⼀一个字典, ⽤用于存储⼀一个⼈人的name, sex, age三个数 据, 完成对其三个数据的输出。
*/
//
// NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"zhngsan",@"name",@"18",@"age",@"nan",@"sex", nil];
//
// NSArray *keys=[dic allKeys];
//
// for (int i=0; i<keys.count; i++) {
//
// NSString *arr1=[keys objectAtIndex:i];
//
// NSLog(@"%@",[dic objectForKey:arr1]);
// }
//
//
// NSEnumerator
// NSEnumerator--数组-正序遍历
// NSEnumerator *array1=[cityarray objectEnumerator];
//
// id value=nil;//存储数组中的元素对象
// while ((value =[array1 nextObject])) {
// NSLog(@"%@",value);
// }
//
// //数组---倒序遍历
// NSEnumerator *arrayreverseenume=[cityarray reverseObjectEnumerator];
// id value=nil;
//
// while ((value =[arrayreverseenume nextObject])) {
// NSLog(@"%@",value);
// }
//
//
//
//
// // NSEnumerator 字典
//
//
// NSEnumerator *dict=[nsdic objectEnumerator];
// id dicte=nil;
// while (dicte =[dict nextObject]) {
// NSLog(@"%@",dicte);
// }
//
//
//
// //NSEnumerator 数组
//
// NSEnumerator *setenum=[string objectEnumerator];
// id setvalue=nil;
// while (setvalue =[setenum nextObject]) {
// NSLog(@"%@",setvalue);
// }
/*
NSEnumerator:遍历数组每个索引处的对象,而NSEnumerator用来描述这种集合迭代的运算方式
通过objectEnumerator向数组请求枚举器,如果想从后向前浏览(打印),可以使用reverseObjectEnumerator 方法在活得枚举器后,开始一个while循环,每次循环都向这个枚举器请求它下一个对象 nextobject nextobject返回nil值时代表循环结束
注意:不可以对可变数组进行一个增加或者删除的操作.因为默认的枚举器不可以改变的.
*/
//for...in 遍历
// //数组遍历
// for (NSString *citystring in cityarray) {
// NSLog(@"%@",citystring);
// }
//
// //字典
// for (NSString *key in nsdic) {
//
// NSLog(@"%@:%@",key, [nsdic objectForKey:key]);
// }
//
// //集合
// for (NSString *str in string) {
// NSLog(@"%@",str);
// }
//
/*
数组排序:因为在我们集合类中只有数组中的元素是有序排列,而字典集合排序是无序的所以只能对数组进行排序
*/
//
// NSArray *string1=[NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",@"zhaoliu", nil];
// NSMutableArray *string2=[NSMutableArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",@"zhaoliu",@"huba", nil];
//
/*使用NSSortDescriptor(排序描述)
它由一下参数组成:
键:对于一个给定的集合对应值得键位将对集合中的每个对象排序;
升序:指定一个集合是否按照升序(YES)还是降序(NO)进行排序的布尔值.
*/
//@"self"代表的是直接可以进行排序的,如果选择对一个类的属性进行一个排序,那么我们就直接放@"属性名"即可,后面的yes 代表的升序 no代表的是降序
// NSSortDescriptor *stringSortDescriptor=[[NSSortDescriptor alloc]initWithKey:@"self" ascending:NO ];
// //不可变数组
// //根据排序的描述符,对数组进行排序
// NSArray *sortedstringarray=[arr sortedArrayUsingDescriptors:[NSArray arrayWithObjects:stringSortDescriptor, nil] ];
// NSLog(@"%@",sortedstringarray);
//
// //可变数组
// [arr1 sortUsingDescriptors:[NSArray arrayWithObjects:stringSortDescriptor, nil]];
// NSLog(@"%@",arr1);
//
//使用数组排序方法,传入数组中的两个元素比较的方法名
//不可变数组
//@selector: 方法选择器
//compare: 默认是一个升序的排序
// NSArray *sortedarray=[string1 sortedArrayUsingSelector:@selector(compare:) ];
// NSLog(@"%@",sortedarray);
//
//
// //可变数组
// [string2 sortUsingSelector:@selector(compare:)];
// NSLog(@"%@",string2
// );
//
//数组排序 数组中存放自定义类对象的排序
person *per1=[[person alloc]initWithName:@"zhangli" sex:@"m" age:30];
person *per2=[[person alloc]initWithName:@"lizi" sex:@"f" age:22];
person *per3=[[person alloc]initWithName:@"zhaowu" sex:@"f" age:13];
person *per4=[[person alloc]initWithName:@"hanqi" sex:@"m" age:33];
person *per5=[[person alloc]initWithName:@"liuba" sex:@"m" age:40];
person *per6=[[person alloc]initWithName:@"hujiu" sex:@"m" age:7];
person *per7=[[person alloc]initWithName:@"guojing" sex:@"f" age:88];
//根据生成的对象生成数组
NSArray *personall=[NSArray arrayWithObjects:per1,per2,per3,per4,per5,per6,per7, nil];
//生成初始化排序的描述---按人的姓名进行一个排序
// NSSortDescriptor *sortwithname=[[NSSortDescriptor alloc]initWithKey:@"name" ascending:YES];
// //通过排序描述对数组进行排序,生成新的排序后的数组
// NSArray *sortedarray=[personall sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortwithname, nil]];
// NSLog(@"%@",sortedarray);
//
// //生成初始化排序的描述---按人的年龄进行一个排序
// NSSortDescriptor *sortwithage=[[NSSortDescriptor alloc]initWithKey:@"age" ascending:YES];
// //通过排序描述对数组进行排序,生成新的排序后的数组
// NSArray *sortedarray1=[personall sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortwithage, nil]];
// NSLog(@"%@",sortedarray1);
//
NSMutableArray *marray=[personall mutableCopy];
NSLog(@"%@",marray);
//可变数组排序:
//生成初始化排序描述---按姓名降序
// NSSortDescriptor *marrayname=[[NSSortDescriptor alloc]initWithKey:@"name" ascending:YES];
// //通过排序描述符对数组进行排序,生成新的排序后的数组
// [marray sortUsingDescriptors:[NSArray arrayWithObjects:marrayname, nil]];
// NSLog(@"%@",marray);
//
//
//
// //按年龄降序
// NSSortDescriptor *marrayage=[[NSSortDescriptor alloc]initWithKey:@"age" ascending:NO];
// //通过排序描述符对数组进行排序,生成新的排序后的数组
// [marray sortUsingDescriptors:[NSArray arrayWithObjects:marrayage, nil]];
// NSLog(@"%@",marray);
NSArray *resultwithnamearray=[personall sortedArrayUsingSelector:@selector(compareByName:)];
NSLog(@"%@",resultwithnamearray);
return 0;
}
// person.h
#import <Foundation/Foundation.h>
@interface person : NSObject
{
NSString *_name;
NSString *_sex;
int _age;
}
-(void)setName:(NSString *)name;
-(NSString *)name;
-(void)setSex:(NSString *)sex;
-(NSString *)sex;
-(void)setAge:(int)age;
-(int)age;
-(instancetype)initWithName:(NSString*)name
sex:(NSString *)sex
age:(int)age;
+(instancetype)personWithName:(NSString*)name
sex:(NSString *)sex
age:(int)age;
//比较两个人的年龄---升序
-(NSComparisonResult)compareByAge:(person *)person;
//降序
-(NSComparisonResult)compareByName:(person *)person;
@end
//person.m
#import "person.h"
@implementation person
-(void)setName:(NSString *)name{
_name=name;
}
-(NSString *)name
{
return _name;
}
-(void)setSex:(NSString *)sex{
_sex=sex;
}
-(NSString *)sex{
return _name;
}
-(void)setAge:(int)age{
_age=age;
}
-(int)age{
return _age;
}
-(instancetype)initWithName:(NSString*)name
sex:(NSString *)sex
age:(int)age{
self=[super init];
if (self) {
_name=name;
_sex=sex;
_age=age;
}
return self;
}
+(instancetype)personWithName:(NSString*)name
sex:(NSString *)sex
age:(int)age{
person *per=[[person alloc]initWithName:name sex:sex age:age];
return per;
}
//比较两个人的年龄---升序
-(NSComparisonResult)compareByAge:(person *)person{
//当条件表达式成立之后,我们的排序结果是看我们的返回值,返回值是-1,代表的是降序,1代表的升序
if ( self.age>person.age) {
return NSOrderedAscending;//-1
}else if(self.age<person.age){
return NSOrderedDescending;//1
}else{
return NSOrderedSame;
}
}
//降序
-(NSComparisonResult)compareByName:(person *)person{
//compare:默认是升序排序,如果想要降序那么加-(符号)
return -[self.name compare:person.name];
}
//重写父类的description方法:它的返回值是oc的字符串
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,sex:%@,age:%d",_name,_sex,_age];
}
@end