• OC-数组排序-NSSortDescriptor使用


    OC-数组排序-NSSortDescriptor使用

    在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArray保存了许多的学生对象。现在有一个功能需要对学生进行按各种条件排序(按姓名升序,按学号降序,按成绩升序)。

    借用上面一个简单的功能来了解一下Object-c中排序描述对象NSSortDescriptor对数组的排序的使用方法。

    简单的了解一下以下几个类:Student(学生类)、MyClass(班级类)

    Student:(只给接口)

    复制代码
     1 @interface Student : NSObject
     2 {
     3     NSString * _name;
     4     NSInteger _num;
     5     NSInteger _score;
     6 }
     7 
     8 - (id)initWithName:(NSString *)name number:(NSInteger)num score:(NSInteger)score;
     9 - (void)setName:(NSString *)name;
    10 - (NSString *)name;
    11 - (void)setNum:(NSInteger)num;
    12 - (NSInteger)num;
    13 - (void)setScore:(NSInteger)score;
    14 - (NSInteger)score;
    15 
    16 @end
    复制代码

    MyClass:(接口)

    复制代码
    @interface MyClass : NSObject
    {
        NSString * _className;
        NSMutableArray * _stuList;
    }
    
    - (id)init;
    - (void)setClassName:(NSString *)name;
    - (NSString*)className;
    - (void)addStudent:(Student *)student;
    - (void)addStudent:(Student *)student atIndex:(NSInteger) index;
    - (void)removeStudent:(Student *)student;
    - (void)removeStudentAtIndex:(NSInteger) index;
    - (void)replaceStudent:(Student *)student atIndex:(NSInteger) index;
    - (void)showStuList;
    - (void)sortedByNumber;//按照学号升序
    - (void)sortedByScore;//按照分数降序
    - (void)sortedByName;//按照名字降序
    
    - (void)sortedByNameAscByNumDescByScoreAsc;
    @end
    复制代码

    MyClass:(具体实现方法)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @implementation MyClass
    - (void)sortedByNumber  //按照学号升序
    {
        NSSortDescriptor *sd1 = [NSSortDescriptor sortDescriptorWithKey:@"_num" ascending:YES];
        NSArray *sdArray = [NSArray arrayWithObjects:sd1, nil];
        [_stuList sortUsingDescriptors:sdArray];
    //    [_stuList sortedArrayUsingDescriptors:sdArray];
    }
    - (void)sortedByScore    //按照分数降序
    {
        NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"_score" ascending:NO];
        NSArray *sdArray = [[NSArray alloc]initWithObjects:sd, nil];
        [_stuList sortUsingDescriptors:sdArray];
    }
    - (void)sortedByName   //按照名字降序
    {
        NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"_name" ascending:NO];
        NSArray *sdArray = [[NSArray array] initWithObjects:sd, nil];
        [_stuList sortUsingDescriptors:sdArray];
    }
    - (void)sortedByNameAscByNumDescByScoreAsc //按照名字升序,学号降序,分数升序来排列数组中的对象
    {
        NSSortDescriptor *sdName = [[NSSortDescriptor alloc]initWithKey:@"_name" ascending:YES];
        NSSortDescriptor *sdNum = [[NSSortDescriptor alloc]initWithKey:@"_num" ascending:NO];
        NSSortDescriptor *sdScore = [NSSortDescriptor sortDescriptorWithKey:@"_score" ascending:YES];
        NSArray *sdArray = [[NSArray alloc] initWithObjects:sdName,sdNum,sdScore, nil];
        [_stuList sortUsingDescriptors:sdArray];
    }
    @end

    就由上面的 sortedByNameAscByNumDescByScoreAsc 方法来分析NSSortDescriptor对象的使用方法。

    1.通过NSSortDescriptor对象的对象方法 initWithKey 或是直接通过类方法  sortDescriptorWithKey 生成一个NSSortDescriptor(排序描述)对象,该对象传进一个排序关键字(该关键字是要排序的数组中元素对象的属性),并且设置按照该关键字(属性)是按照升序还是降序。

    2.将NSSortDescriptor对象(可以多个)添加到一个数组中。

    3.最后通过数组的方法 sortUsingDescriptors ,将第二步中的数组作为参数传递进去,获得的结果就是已经排序好的数组了。

    以上方法适用于可变数组和不可变数组,只是方法略微有点不一样。

    转载:http://www.cnblogs.com/BeyondAverage0908/p/4571638.html

  • 相关阅读:
    【BZOJ4945&&UOJ317】游戏(2-sat,拓扑序)
    【Hihocoder1636】Pangu and Stones(区间DP)
    【BZOJ1579】Revamping Trails(分层图,最短路,堆)
    【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
    【HDOJ6218】Bridge(线段树,set,网格图,连通性)
    【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)
    【HDOJ6217】BBP Formula(公式)
    【HDOJ6224】Legends of the Three Kingdoms(概率DP)
    152.图论
    151.函数
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5592967.html
Copyright © 2020-2023  润新知