iOS - 數(shù)組排序

圖片源自網(wǎng)絡(luò)

數(shù)組可對(duì)其中包含的元素進(jìn)行排序。

在排序前眼姐,我們需要定義一個(gè)Model類米辐,將Model類對(duì)象添加至數(shù)組中艘希。

  • 定義一個(gè)簡(jiǎn)單的Model類

    // Model.h
    @interface Model : NSObject
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) BOOL sex;
    @property (nonatomic, assign) double height;
    @property (nonatomic, assign) int age;
    @end
    
    // Model.m
    @implementation Model
    @end
    
  • 生成假數(shù)據(jù):

      NSArray *nameArray = @[@"小白", @"大白", @"老白", @"艾爾", @"黑山", @"張三", @"李四", @"王五", @"范晶", @"荊南", @"昔日", @"安安"];
      NSArray *ageArray = @[@3, @32, @45, @22, @32, @27, @15, @22, @55, @34, @32, @22];
      NSArray *heightArray = @[@100, @166, @180, @165, @163, @176, @174, @183, @186, @178, @167, @160];
      
      NSMutableArray *originalArray = [NSMutableArray arrayWithCapacity:nameArray.count];
          for (int i = 0; i<nameArray.count; i++) {
          
          Model *model = [[Model alloc]init];
          model.name = nameArray[i];
          model.age = [ageArray[i] intValue];
          model.height = [heightArray[i] doubleValue];
          [originalArray addObject:model];
       }
    
    • 輸出數(shù)組元素
      // 輸出數(shù)組元素    
      for (Model *model in originalArray) {
          NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
      }
      /*
       age: 3 ,height: 100.0 name: 小白
       age: 32,height: 166.0 name: 大白
       age: 45,height: 180.0 name: 老白
       age: 22,height: 165.0 name: 艾爾
       age: 32,height: 163.0 name: 黑山
       age: 27,height: 176.0 name: 張三
       age: 15,height: 174.0 name: 李四
       age: 22,height: 183.0 name: 王五
       age: 55,height: 186.0 name: 范晶
       age: 34,height: 178.0 name: 荊南
       age: 32,height: 167.0 name: 昔日
       age: 22,height: 160.0 name: 安安
       */
    

倒序

  • 在Array的擴(kuò)展類(NSExtendedArray)中提供了reverseObjectEnumerator方法

    - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
    
  • 上述方法的返回值為NSEnumerator類對(duì)象。通過NSEnumerator的擴(kuò)展類(NSExtendedEnumerator)中的allObjects屬性拇囊,將其轉(zhuǎn)化為Array類對(duì)象。

    @interface NSEnumerator<ObjectType> (NSExtendedEnumerator)
    
    @property (readonly, copy) NSArray<ObjectType> *allObjects;
    
    @end
    
  • 使用范例

    //倒序
    originalArray = (NSMutableArray *)[[originalArray reverseObjectEnumerator] allObjects];
    
    • 輸出排序結(jié)果
    // 輸出排序結(jié)果
    
    for (Model *model in originalArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /*
    age: 22,height: 160.0 name: 安安
    age: 32,height: 167.0 name: 昔日
    age: 34,height: 178.0 name: 荊南
    age: 55,height: 186.0 name: 范晶
    age: 22,height: 183.0 name: 王五
    age: 15,height: 174.0 name: 李四
    age: 27,height: 176.0 name: 張三
    age: 32,height: 163.0 name: 黑山
    age: 22,height: 165.0 name: 艾爾
    age: 45,height: 180.0 name: 老白
    age: 32,height: 166.0 name: 大白
    age: 3 ,height: 100.0 name: 小白
    */
    

升序/ 降序

1. sortedArrayUsingSelector & sortUsingSelector

  • NSArray的排序方法(sortedArrayUsingSelector:)是生成一個(gè)排好序的新數(shù)組靶橱。
  • NSMutableArray的排序可以直接對(duì)該數(shù)組進(jìn)行排序(sortUsingSelector:),也可以生成新數(shù)組(sortedArrayUsingSelector: ),而原數(shù)組不變寥袭。
  • 數(shù)組元素為字符串或基本數(shù)據(jù)類型時(shí)路捧,可直接使用系統(tǒng)定義的函數(shù)進(jìn)行排序
    • NSString類具有(compare:)(caseInsensitiveCompare:)(localizedStandardCompare:)方法。

      compare:區(qū)分大小寫
      caseInsensitiveCompare: 不區(qū)分大小寫
      localizedStandardCompare:根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫传黄,變音符號(hào)等等的順序而發(fā)生改變)

    • 基本數(shù)據(jù)類型如int, double等, 可使用NSNumber類具有的(compare:)方法杰扫。

    • 使用范例:

      • 字符串?dāng)?shù)組
      //字符串?dāng)?shù)組
      NSMutableArray *newNameArray = [NSMutableArray arrayWithArray:nameArray];
      [newNameArray addObjectsFromArray:@[@"Smith",@"Bohn",@"aohn",@"john"]];
      NSArray *resultNameArray = [newNameArray sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
      
      // 輸出排序結(jié)果
      for (NSString *name in resultNameArray) {
      NSLog(@"name: %@",name);
      }
      /** //字符串?dāng)?shù)組
       name: 艾爾
       name: 安安
       name: 大白
       name: 范晶
       name: 黑山
       name: 荊南
       name: 老白
       name: 李四
       name: 王五
       name: 昔日
       name: 小白
       name: 張三
       name: aohn
       name: Bohn
       name: john
       name: Smith
       name: Smith你好
        注:先按拼音排序 在按字母排序 不分大小寫
        */
      
      • int類型數(shù)組
      //int類型數(shù)組
      NSArray *resultAgeArray = [ageArray sortedArrayUsingSelector:@selector(compare:)];
      
      // 輸出排序結(jié)果
      for (NSNumber *age in resultAgeArray) {
          NSLog(@"age: %@",age);
      }
       /**
       //int類型數(shù)組
       age: 3
       age: 15
       age: 22
       age: 22
       age: 22
       age: 27
       age: 32
       age: 32
       age: 32
       age: 34
       age: 45
       age: 55
       */
      
  • 數(shù)組元素為模型對(duì)象或字典類型時(shí),需要自定義排序方法
    • 自定義Mode擴(kuò)展類并添加自定義方法
      // NSNumber+compare.h
      @interface Model (compare)
      - (NSComparisonResult)compareName:(Model *)otherModel;
      - (NSComparisonResult)compareAge:(Model *)otherModel;
      @end
      
      // NSNumber+compare.m
      @implementation Model (compare)
      - (NSComparisonResult)compareName:(Model *)otherModel
      {
          NSComparisonResult result = [self.name localizedStandardCompare:otherModel.name];
          return  result == NSOrderedDescending; // 升序
          //        return  result == NSOrderedSame; // 不變
          //        return result == NSOrderedAscending;  // 降序
      }
      - (NSComparisonResult)compareAge:(Model *)otherModel
      {
          NSNumber *number1 = [NSNumber numberWithInt:self.age];
          NSNumber *number2 = [NSNumber numberWithInt:otherModel.age];
          NSComparisonResult result = [number1 compare:number2];
          return  result == NSOrderedDescending; // 升序
          //        return  result == NSOrderedSame; // 不變
          //        return result == NSOrderedAscending;  // 降序
      }
      @end
      
    注:自定義方法返回值必須為NSComparisonResult類型
    • 使用范例

      • 根據(jù)name屬性進(jìn)行排序
          //根據(jù)name屬性進(jìn)行排序 
           NSArray *resultStrArray = [originalArray sortedArrayUsingSelector:@selector(compareName:)];
      
          // 輸出排序結(jié)果
      
          for (Model *model in resultStrArray) {
              NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
          }
          /**
            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: 張三
            */
      
      • 根據(jù)age屬性進(jìn)行排序
          //根據(jù)age屬性進(jìn)行排序
          NSArray *resultNumArray = [originalArray sortedArrayUsingSelector:@selector(compareAge:)];
      
          // 輸出排序結(jié)果
          for (Model *model in resultNumArray) {
              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: 范晶
           */
      

2. sortedArrayUsingComparator & sortUsingComparator

  • NSArray的排序方法(sortedArrayUsingComparator:)是生成一個(gè)排好序的新數(shù)組膘掰。
  • NSMutableArray的排序可以直接對(duì)該數(shù)組進(jìn)行排序(sortUsingComparator:),也可以生成新數(shù)組(sortedArrayUsingComparator: ),而原數(shù)組不變章姓。
  • 如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫,變音符號(hào)等等的順序而發(fā)生改變)
    //如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫识埋,變音符號(hào)等等的順序而發(fā)生改變)
    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;  // 降序
    }];


   // 輸出排序結(jié)果
  for (Model *model in resultStrArray) {
      NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
  }
  /**
   如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫凡伊,變音符號(hào)等等的順序而發(fā)生改變)
   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等, 就需要對(duì)將其轉(zhuǎn)化為NSNumber類型;
    //如果待比較的屬性是其他的類型, 比如int, double等, 就需要對(duì)將其轉(zhuǎn)化為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;  // 降序
    }];
    // 輸出排序結(jié)果
    for (Model *model in resultNumArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     //如果待比較的屬性是其他的類型, 比如int, double等, 就需要對(duì)將其轉(zhuǎn)化為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: )是生成一個(gè)排好序的新數(shù)組。
  • NSMutableArray的排序可以直接對(duì)該數(shù)組進(jìn)行排序(sortWithOptions: usingComparator: ),也可以生成新數(shù)組(sortedArrayWithOptions: usingComparator: ),而原數(shù)組不變窒舟。
  • 參數(shù)解釋

    • opts : 枚舉類型NSSortOptions(NSSortStable,NSSortConcurrent), 其中NSSortStable 更穩(wěn)定系忙,但是效率低,比較時(shí)是串行操作惠豺。NSSortConcurrent 比較時(shí)是并行操作银还,效率高,適合排序大規(guī)模數(shù)據(jù)洁墙。通常我們使用NSSortStable蛹疯。快點(diǎn)這里哦

    • cmptr :NSComparator比較器,block方法, 可以在其中指定比較規(guī)則,返回值為NSComparisonResult

  • 如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫热监,變音符號(hào)等等的順序而發(fā)生改變)

    //如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫苍苞,變音符號(hào)等等的順序而發(fā)生改變)
    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;  // 降序
    }];

     // 輸出排序結(jié)果
    for (Model *model in resultStrArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     如果待比較的屬性是字符串(NSString)類型, 使用其默認(rèn)的方法: localizedStandardCompare: 它將根據(jù)當(dāng)前語言環(huán)境的語言規(guī)則進(jìn)行排序(語言環(huán)境可能會(huì)根據(jù)大小寫,變音符號(hào)等等的順序而發(fā)生改變)
     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等, 就需要對(duì)將其轉(zhuǎn)化為NSNumber類型;
    //如果待比較的屬性是其他的類型, 比如int, double等, 就需要對(duì)將其轉(zhuǎn)化為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;  // 降序
    }];
    // 輸出排序結(jié)果
    for (Model *model in resultNumArray) {
        NSLog(@"age: %d,height: %.1f name: %@", model.age,model.height, model.name);
    }
    /**
     //如果待比較的屬性是其他的類型, 比如int, double等, 就需要對(duì)將其轉(zhuǎn)化為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:)是生成一個(gè)排好序的新數(shù)組狼纬。
  • NSMutableArray的排序可以直接對(duì)該數(shù)組進(jìn)行排序(sortUsingDescriptors:),也可以生成新數(shù)組(sortedArrayUsingDescriptors: ),而原數(shù)組不變羹呵。
+ (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);
  • 使用范例
//創(chuàng)建排序規(guī)則NSSortDescriptor
//key :按照age屬性 升序排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//給數(shù)組添加排序規(guī)則
[originalArray sortUsingDescriptors:@[sort]];
// 輸出排序結(jié)果

 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: 范晶
 */
  • 可同時(shí)指定多個(gè)規(guī)則:其優(yōu)先級(jí)取決于在數(shù)組中的先后順序
//創(chuàng)建排序規(guī)則NSSortDescriptor
//key :按照age屬性 升序排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//age 相同 按照height屬性 升序排序
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];
//給數(shù)組添加排序規(guī)則
[originalArray sortUsingDescriptors:@[sort,sort1]];
// 輸出排序結(jié)果

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: 昔日

*/
注:關(guān)于NSSortDescriptor類更詳細(xì)的排序使用,請(qǐng)參考iOS - 排序: NSSortDescriptor

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

  • NSArray的排序方法(sortedArrayUsingFunction:context:)與(sortedArrayUsingFunction:context:hint:)是生成一個(gè)排好序的新數(shù)組疗琉。
  • NSMutableArray的排序可以直接對(duì)該數(shù)組進(jìn)行排序(sortUsingFunction:context:)與(sortUsingFunction:context:hint:),也可以生成新數(shù)組(sortedArrayUsingFunction:context:)與(sortedArrayUsingFunction:context:hint:),而原數(shù)組不變冈欢。
  • 參數(shù)解釋
    • comparator:基于函數(shù)指針的自定義函數(shù)

    • context:上下文,通常為NuLL

    • hint:加速排序盈简,同sortedArrayHint

    注:hinted sort 方式在你有一個(gè)已排序的大數(shù)組 (N 個(gè)元素) 并且只改變其中一小部分(P 個(gè)添加和刪除凑耻,這里 P遠(yuǎn)小于 N)時(shí),會(huì)非常有效柠贤。你可以重用原來的排序結(jié)果香浩,然后在 N 個(gè)老項(xiàng)目和 P 個(gè)新項(xiàng)目進(jìn)行一個(gè)概念上的歸并排序。為了得到合適的 hint臼勉,你應(yīng)該在原來的數(shù)組排序后使用 sortedArrayHint 來在你需要的時(shí)候(比如在數(shù)組改變后想重新排序時(shí))保證持有它邻吭。
  • 使用范例

    • 定義一個(gè)函數(shù)方法
     NSInteger compareByAge(id obj1, id obj2, void *context){
         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;  // 降序
    }
    
    • 排序
        NSArray *resultNumArray = [originalArray sortedArrayUsingFunction:compareByAge context:nil];
    
      // 輸出排序結(jié)果
      for (Model *model in resultNumArray) {
          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: 范晶
      */
    

總結(jié)

  • 數(shù)組元素為字符串或基本數(shù)據(jù)類型時(shí),推薦使用系統(tǒng)定義的函數(shù)進(jìn)行排序sortedArrayUsingSelector & sortUsingSelector
  • 需要通過多個(gè)key進(jìn)行排序時(shí)宴霸,推薦使用sortedArrayUsingDescriptors & sortUsingDescriptors
  • 比較方法復(fù)雜時(shí)囱晴,推薦使用sortedArrayWithOptions: usingComparator & sortWithOptions: usingComparator或sortedArrayUsingComparator & sortUsingComparator

參考

NSArray 排序sortedArrayUsingComparator

NSArray和NSMutableArray內(nèi)容的排序

iOS數(shù)組排序(倒敘 生序 降序)

iOS - 排序: NSSortDescriptor

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏蚓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子畸写,更是在濱河造成了極大的恐慌驮瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枯芬,死亡現(xiàn)場(chǎng)離奇詭異论笔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)千所,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門狂魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人真慢,你說我怎么就攤上這事毅臊。” “怎么了黑界?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵管嬉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我朗鸠,道長(zhǎng)蚯撩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任烛占,我火速辦了婚禮胎挎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忆家。我一直安慰自己犹菇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布芽卿。 她就那樣靜靜地躺著揭芍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卸例。 梳的紋絲不亂的頭發(fā)上称杨,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音筷转,去河邊找鬼姑原。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呜舒,可吹牛的內(nèi)容都是我干的锭汛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼店乐!你這毒婦竟也來了艰躺?” 一聲冷哼從身側(cè)響起呻袭,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤眨八,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后左电,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廉侧,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年篓足,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了段誊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栈拖,死狀恐怖连舍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩哟,我是刑警寧澤索赏,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贴彼,受9級(jí)特大地震影響潜腻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器仗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一融涣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧精钮,春花似錦威鹿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弹沽,卻和暖如春檀夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背策橘。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工炸渡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丽已。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓蚌堵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼畏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 排序規(guī)則描述類: NSSortDescriptor NSSortDescriptor來指定排序規(guī)則, 對(duì)集合等進(jìn)行...
    SkyMing一C閱讀 6,580評(píng)論 3 12
  • 1督赤、NSSortDescriptor排序 概述: 數(shù)組是有序容器,因此集合中只有數(shù)組才能排序。該類能夠方便的實(shí)現(xiàn)對(duì)...
    lingxuemy閱讀 1,575評(píng)論 0 2
  • Pre:很多文章對(duì)于SEL排序講解太過含糊泻蚊,特寫此文講述清楚躲舌。 官方提供了幾個(gè)api進(jìn)行數(shù)組排序操作,開發(fā)者只需提...
    圓臉黑貓警長(zhǎng)閱讀 23,980評(píng)論 0 22
  • 數(shù)組元素類型 假設(shè)我們這個(gè)數(shù)組里面的元素是一個(gè) model 類型性雄,比如 CHSAssetGroup没卸,其CHSAss...
    乒什么乓閱讀 4,095評(píng)論 0 8
  • 日常項(xiàng)目中偶爾會(huì)有用到要對(duì)接收到數(shù)據(jù)進(jìn)行排序操作。如果采用遍歷等方法來進(jìn)行不免寫大量代碼而且復(fù)用性很低秒旋,在這里記錄...
    一路向北客閱讀 3,053評(píng)論 0 1