iOS 数组排序

作者: lingxuemy | 来源:发表于2017-03-15 16:43 被阅读172次
    1、NSSortDescriptor排序
    概述:

    数组是有序容器,因此集合中只有数组才能排序。该类能够方便的实现对数组中的对象进行升序或者降序的排序。它可以把元素的某个属性作为key进行升序或降序的排序,每个NSSortDescriptor对象就是一个排序条件。

    NSSortDescriptor初始化方法
    - (instancetype)initWithKey:(NSString *)key ascending:(BOOL)ascending;
    

    key:按照数组中对象的哪个属性进行排序,如果数组中存放的是能够直接排序的对象(比如:字符串),直接使 @"self" 或者 nil 即可;如果存放的是自定义类的对象,使用想要进行排序的属性名即可(比如:想按照Person类的name进行排序, 使用 @"name" 作为参数)。ascending:排序的标志,是升序还是降序。 YES - 升序, NO - 降序。

    NSSortDescriptor创建
    NSSortDescriptor *sortDes1 = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; // 升序
    NSSortDescriptor *sortDes2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; // 降序
    

    ① 不可变数组排序

    // 基本数据类型不可变数组
    array = [array sortedArrayUsingDescriptors:@[sortDes1]];
    NSLog(@"%@", array);
    // 自定义对象不可变数组
    // 按照名字排序
    personArray = [personArray sortedArrayUsingDescriptors:@[sortDes2]];
    NSLog(@"%@", personArray);
    

    ② 可变数组排序

    // 基本类型可变数组
    [mArray sortUsingDescriptors:@[sortDes1]];
    NSLog(@"%@", mArray);
    // 自定义对象可变数组
    // 按照名字排序
    [personMArray sortUsingDescriptors:@[sortDes2]];
    NSLog(@"%@", personMArray);
    
    2、使用数组中 两个元素比较的方法名 进行排序

    ① 不可变数组排序:(排序结果生成新数组, 原数组无改变)

    - (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
    

    注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisonResult的方法名。

    // 可变数组(基本数据类型)
    [mArray sortUsingSelector:@selector(compare:)];
    NSLog(@"%@", mArray);
    // 可变的数组(自定义类型的对象)
    // 按照名字排序
    [personMArray sortUsingSelector:@selector(compareByName:)];
    NSLog(@"%@", personMArray);
    

    ② 可变数组排序:(直接对原数组操作,无新数组生成)

    - (void)sortUsingSelector:(SEL)comparator;
    

    注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisionResult的函数

    // 可变数组(基本数据类型)
    [mArray sortUsingSelector:@selector(compare:)];
    NSLog(@"%@", mArray);
    // 可变的数组(自定义类型的对象)
    // 按照名字排序
    [personMArray sortUsingSelector:@selector(compareByName:)];
    NSLog(@"%@", personMArray);
    

    Person类中compareByName方法:

    // 比较方法的声明
    - (NSComparisonResult)compareByName:(Person *)anotherPerson;
    // 比较方法的实现
    - (NSComparisonResult)compareByName:(Person *)anotherPerson
    {
    return [self.name compare:anotherPerson.name];
    }
    

    上面方法排完序后返回的数组英文和汉字是分开的,所以如需将汉字也排入英文中,请参考:https://github.com/lingxuemy/XCompareString.git

    相关文章

      网友评论

        本文标题:iOS 数组排序

        本文链接:https://www.haomeiwen.com/subject/dqfkgttx.html