iOS专题技术收录iOS技术专题111

iOS - 数组排序

2017-11-25  本文已影响472人  SkyMing一C
图片源自网络

数组可对其中包含的元素进行排序。

在排序前,我们需要定义一个Model类,将Model类对象添加至数组中。

倒序

升序/ 降序

1. sortedArrayUsingSelector & sortUsingSelector

  • NSArray的排序方法(sortedArrayUsingSelector:)是生成一个排好序的新数组。
  • NSMutableArray的排序可以直接对该数组进行排序(sortUsingSelector:),也可以生成新数组(sortedArrayUsingSelector: ),而原数组不变。

2. sortedArrayUsingComparator & sortUsingComparator

  • NSArray的排序方法(sortedArrayUsingComparator:)是生成一个排好序的新数组。
  • NSMutableArray的排序可以直接对该数组进行排序(sortUsingComparator:),也可以生成新数组(sortedArrayUsingComparator: ),而原数组不变。
    //如果待比较的属性是字符串(NSString)类型, 使用其默认的方法: localizedStandardCompare: 它将根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)
    NSArray *resultStrArray = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        Model *model1 = obj1;
        Model *model2 = obj2;
        NSComparisonResult result = [model1.name localizedStandardCompare:model2.name];
        return  result == NSOrderedDescending; // 升序
        //        return  result == NSOrderedSame; // 不变
        //        return result == NSOrderedAscending;  // 降序
    }];


   // 输出排序结果
  for (Model *model in resultStrArray) {
      NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
  }
  /**
   如果待比较的属性是字符串(NSString)类型, 使用其默认的方法: localizedStandardCompare: 它将根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)
   age: 22,height: 165.0 name: 艾尔
   age: 22,height: 160.0 name: 安安
   age: 32,height: 166.0 name: 大白
   age: 55,height: 186.0 name: 范晶
   age: 32,height: 163.0 name: 黑山
   age: 34,height: 178.0 name: 荆南
   age: 45,height: 180.0 name: 老白
   age: 15,height: 174.0 name: 李四
   age: 22,height: 183.0 name: 王五
   age: 32,height: 167.0 name: 昔日
   age: 3,height: 100.0 name: 小白
   age: 27,height: 176.0 name: 张三
   */
    //如果待比较的属性是其他的类型, 比如int, double等, 就需要对将其转化为NSNumber类型;
    NSArray *resultNumArray = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        Model *model1 = obj1;
        Model *model2 = obj2;
        NSNumber *number1 = [NSNumber numberWithInt:model1.age];
        NSNumber *number2 = [NSNumber numberWithInt:model2.age];
        NSComparisonResult result = [number1 compare:number2];
        
        return  result == NSOrderedDescending; // 升序
        //        return  result == NSOrderedSame; // 不变
        //        return result == NSOrderedAscending;  // 降序
    }];
    // 输出排序结果
    for (Model *model in resultNumArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     //如果待比较的属性是其他的类型, 比如int, double等, 就需要对将其转化为NSNumber类型;
    age: 3 ,height: 100.0 name: 小白
    age: 15,height: 174.0 name: 李四
    age: 22,height: 165.0 name: 艾尔
    age: 22,height: 183.0 name: 王五
    age: 22,height: 160.0 name: 安安
    age: 27,height: 176.0 name: 张三
    age: 32,height: 166.0 name: 大白
    age: 32,height: 163.0 name: 黑山
    age: 32,height: 167.0 name: 昔日
    age: 34,height: 178.0 name: 荆南
    age: 45,height: 180.0 name: 老白
    age: 55,height: 186.0 name: 范晶
    */

3. sortedArrayWithOptions: usingComparator & sortWithOptions: usingComparator

  • NSArray的排序方法(sortedArrayWithOptions: usingComparator: )是生成一个排好序的新数组。
  • NSMutableArray的排序可以直接对该数组进行排序(sortWithOptions: usingComparator: ),也可以生成新数组(sortedArrayWithOptions: usingComparator: ),而原数组不变。
    //如果待比较的属性是字符串(NSString)类型, 使用其默认的方法: localizedStandardCompare: 它将根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)
    NSArray *resultStrArray = [originalArray sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        Model *model1 = obj1;
        Model *model2 = obj2;
        NSComparisonResult result = [model1.name localizedStandardCompare:model2.name];
        return  result == NSOrderedDescending; // 升序
        //        return  result == NSOrderedSame; // 不变
        //        return result == NSOrderedAscending;  // 降序
    }];

     // 输出排序结果
    for (Model *model in resultStrArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     如果待比较的属性是字符串(NSString)类型, 使用其默认的方法: localizedStandardCompare: 它将根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)
     age: 22,height: 165.0 name: 艾尔
     age: 22,height: 160.0 name: 安安
     age: 32,height: 166.0 name: 大白
     age: 55,height: 186.0 name: 范晶
     age: 32,height: 163.0 name: 黑山
     age: 34,height: 178.0 name: 荆南
     age: 45,height: 180.0 name: 老白
     age: 15,height: 174.0 name: 李四
     age: 22,height: 183.0 name: 王五
     age: 32,height: 167.0 name: 昔日
     age: 3,height: 100.0 name: 小白
     age: 27,height: 176.0 name: 张三
     */
    //如果待比较的属性是其他的类型, 比如int, double等, 就需要对将其转化为NSNumber类型;
    NSArray *resultNumArray = [originalArray sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        Model *model1 = obj1;
        Model *model2 = obj2;
        NSNumber *number1 = [NSNumber numberWithInt:model1.age];
        NSNumber *number2 = [NSNumber numberWithInt:model2.age];
        NSComparisonResult result = [number1 compare:number2];

        return  result == NSOrderedDescending; // 升序
        //        return  result == NSOrderedSame; // 不变
        //        return result == NSOrderedAscending;  // 降序
    }];
    // 输出排序结果
    for (Model *model in resultNumArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     //如果待比较的属性是其他的类型, 比如int, double等, 就需要对将其转化为NSNumber类型;
    age: 3 ,height: 100.0 name: 小白
    age: 15,height: 174.0 name: 李四
    age: 22,height: 165.0 name: 艾尔
    age: 22,height: 183.0 name: 王五
    age: 22,height: 160.0 name: 安安
    age: 27,height: 176.0 name: 张三
    age: 32,height: 166.0 name: 大白
    age: 32,height: 163.0 name: 黑山
    age: 32,height: 167.0 name: 昔日
    age: 34,height: 178.0 name: 荆南
    age: 45,height: 180.0 name: 老白
    age: 55,height: 186.0 name: 范晶
    */

4. sortedArrayUsingDescriptors & sortUsingDescriptors

  • NSArray的排序方法(sortedArrayUsingDescriptors:)是生成一个排好序的新数组。
  • NSMutableArray的排序可以直接对该数组进行排序(sortUsingDescriptors:),也可以生成新数组(sortedArrayUsingDescriptors: ),而原数组不变。
+ (instancetype)sortDescriptorWithKey:(nullable NSString *)key ascending:(BOOL)ascending NS_AVAILABLE(10_6, 4_0);
+ (instancetype)sortDescriptorWithKey:(nullable NSString *)key ascending:(BOOL)ascending selector:(nullable SEL)selector NS_AVAILABLE(10_6, 4_0);

// keys may be key paths
- (instancetype)initWithKey:(nullable NSString *)key ascending:(BOOL)ascending;
- (instancetype)initWithKey:(nullable NSString *)key ascending:(BOOL)ascending selector:(nullable SEL)selector;

+ (instancetype)sortDescriptorWithKey:(nullable NSString *)key ascending:(BOOL)ascending comparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
- (instancetype)initWithKey:(nullable NSString *)key ascending:(BOOL)ascending comparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
//创建排序规则NSSortDescriptor
//key :按照age属性 升序排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//给数组添加排序规则
[originalArray sortUsingDescriptors:@[sort]];
// 输出排序结果

 for (Model *model in originalArray) {
    NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
}
  /**
 age: 3 ,height: 100.0 name: 小白
 age: 15,height: 174.0 name: 李四
 age: 22,height: 165.0 name: 艾尔
 age: 22,height: 183.0 name: 王五
 age: 22,height: 160.0 name: 安安
 age: 27,height: 176.0 name: 张三
 age: 32,height: 166.0 name: 大白
 age: 32,height: 163.0 name: 黑山
 age: 32,height: 167.0 name: 昔日
 age: 34,height: 178.0 name: 荆南
 age: 45,height: 180.0 name: 老白
 age: 55,height: 186.0 name: 范晶
 */
//创建排序规则NSSortDescriptor
//key :按照age属性 升序排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//age 相同 按照height属性 升序排序
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];
//给数组添加排序规则
[originalArray sortUsingDescriptors:@[sort,sort1]];
// 输出排序结果

for (Model *model in originalArray) {
SLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
}
/**
age: 3 ,height: 100.0 name: 小白
age: 15,height: 174.0 name: 李四
age: 22,height: 160.0 name: 安安
age: 22,height: 165.0 name: 艾尔
age: 22,height: 183.0 name: 王五
age: 27,height: 176.0 name: 张三
age: 32,height: 163.0 name: 黑山
age: 32,height: 166.0 name: 大白
age: 32,height: 167.0 name: 昔日
age: 34,height: 178.0 name: 荆南
age: 45,height: 180.0 name: 老白
age: 55,height: 186.0 name: 范晶
*/
/** 其中age相同的按照height属性 升序排序
age: 22,height: 160.0 name: 安安
age: 22,height: 165.0 name: 艾尔
age: 22,height: 183.0 name: 王五

age: 32,height: 163.0 name: 黑山
age: 32,height: 166.0 name: 大白
age: 32,height: 167.0 name: 昔日

*/
注:关于NSSortDescriptor类更详细的排序使用,请参考iOS - 排序: NSSortDescriptor

5. sortedArrayUsingFunction:context & sortedArrayUsingFunction:context:hint & sortUsingFunction:context & sortUsingFunction:context:hint

  • NSArray的排序方法(sortedArrayUsingFunction:context:)与(sortedArrayUsingFunction:context:hint:)是生成一个排好序的新数组。
  • NSMutableArray的排序可以直接对该数组进行排序(sortUsingFunction:context:)与(sortUsingFunction:context:hint:),也可以生成新数组(sortedArrayUsingFunction:context:)与(sortedArrayUsingFunction:context:hint:),而原数组不变。

总结

参考

NSArray 排序sortedArrayUsingComparator

NSArray和NSMutableArray内容的排序

iOS数组排序(倒叙 生序 降序)

iOS - 排序: NSSortDescriptor

上一篇下一篇

猜你喜欢

热点阅读