OC 遍历及排序

//  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
原文地址:https://www.cnblogs.com/huyibo/p/5475339.html