• NSArray的三种排序方法


    1.sortedArrayUsingSelector

    (按Key值大小对NSDictionary排序)
    1 NSMutableArray *array = [NSMutableArray arrayWithObjects:
    2                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj0", [NSNumber numberWithInt:0], nil],
    3                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj5", [NSNumber numberWithInt:5], nil],
    4                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj2", [NSNumber numberWithInt:2], nil],
    5                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj3", [NSNumber numberWithInt:3], nil],
    6                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj1", [NSNumber numberWithInt:1], nil],
    7                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj4", [NSNumber numberWithInt:4], nil], nil];
    8     
    9 NSArray *resultArray = [array sortedArrayUsingSelector:@selector(compare:)];

    因为NSDictionary没有compare的排序比较方法,所以需要我们自己写

     1 .h
     2 @interface NSDictionary (compare)
     3 {}
     4 
     5 -(NSComparisonResult)compare:(NSDictionary *)otherDictionary;
     6 
     7 @end
     8 
     9 .m
    10 @implementation NSDictionary (compare)
    11 
    12 - (NSComparisonResult)compare: (NSDictionary *)otherDictionary
    13 {
    14     NSDictionary *tempDictionary = (NSDictionary *)self;
    15     
    16     NSNumber *number1 = [[tempDictionary allKeys] objectAtIndex:0];
    17     NSNumber *number2 = [[otherDictionary allKeys] objectAtIndex:0];
    18     
    19     NSComparisonResult result = [number1 compare:number2];
    20     
    21     return result == NSOrderedDescending; // 升序
    22 //    return result == NSOrderedAscending;  // 降序
    23 }
    24 
    25 @end

    2.sortedArrayUsingComparator

     1     NSMutableArray *array = [NSMutableArray arrayWithObjects:
     2                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj0", [NSNumber numberWithInt:0], nil],
     3                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj5", [NSNumber numberWithInt:5], nil],
     4                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj2", [NSNumber numberWithInt:2], nil],
     5                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj3", [NSNumber numberWithInt:3], nil],
     6                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj1", [NSNumber numberWithInt:1], nil],
     7                              [NSDictionary dictionaryWithObjectsAndKeys:@"Obj4", [NSNumber numberWithInt:4], nil], nil];
     8     
     9 //    NSArray *resultArray = [array sortedArrayUsingSelector:@selector(compare:)];
    10     
    11     NSArray *resultArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    12         
    13         NSNumber *number1 = [[obj1 allKeys] objectAtIndex:0];
    14         NSNumber *number2 = [[obj2 allKeys] objectAtIndex:0];
    15         
    16         NSComparisonResult result = [number1 compare:number2];
    17         
    18         return result == NSOrderedDescending; // 升序
    19 //        return result == NSOrderedAscending;  // 降序
    20     }];

    3.sortedArrayUsingDescriptors & sortUsingDescriptors

    前者带返回值,是NSArray的方法,排好序的数组是返回值中的数组;
    后者不带返回值,是NSMutableArray的方法,是对当前数组自己排序
     1 .h
     2 @interface Person : NSObject
     3 {
     4     NSString  *_name;
     5     
     6     NSInteger  _age;
     7 }
     8 @property (nonatomic, retain) NSString  *name;
     9 @property (nonatomic, assign) NSInteger  age;
    10 @end
    11 
    12 .m
    13 @implementation Person
    14 @synthesize name = _name;
    15 @synthesize age  = _age;
    16 
    17 
    18 - (void)dealloc
    19 {
    20     [_name release];
    21     
    22     [super dealloc];
    23 }
    24 
    25 @end
     1     Person *person1 = [[Person alloc] init];
     2     [person1 setName:@"ABC"];
     3     [person1 setAge:24];
     4     
     5     Person *person2 = [[Person alloc] init];
     6     [person2 setName:@"ACB"];
     7     [person2 setAge:22];
     8     
     9     Person *person3 = [[Person alloc] init];
    10     [person3 setName:@"ABD"];
    11     [person3 setAge:33];
    12     
    13     NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
    14     [person1 release];
    15     [person2 release];
    16     [person3 release];
    17     
    18     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"_age" ascending:YES];
    19     
    20     NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    21     
    22     for(NSInteger i = 0; i < [tempArray count]; i++)
    23     {
    24         NSLog(@"%@--------%d
    ", [[tempArray objectAtIndex:i] name], [[tempArray objectAtIndex:i] age]);
    25     }
    26     
    27 //    [array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    28 //    
    29 //    for(NSInteger i = 0; i < [array count]; i++)
    30 //    {
    31 //        NSLog(@"%@--------%d
    ", [[array objectAtIndex:i] name], [[array objectAtIndex:i] age]);
    32 //    }

    sortDescriptorWithKey:@"_age",以age作为标准来做比较。

     1     Person *person1 = [[Person alloc] init];
     2     [person1 setName:@"ABCD"];
     3     [person1 setAge:24];
     4     
     5     Person *person2 = [[Person alloc] init];
     6     [person2 setName:@"ACBD"];
     7     [person2 setAge:22];
     8     
     9     Person *person3 = [[Person alloc] init];
    10     [person3 setName:@"ABDC"];
    11     [person3 setAge:33];
    12     
    13     Person *person4 = [[Person alloc] init];
    14     [person4 setName:@"ACDB"];
    15     [person4 setAge:22];
    16     
    17     NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person3, person4, person2, nil];
    18     [person1 release];
    19     [person2 release];
    20     [person3 release];
    21     [person4 release];
    22     
    23     NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"_age" ascending:YES];
    24     NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"_name" ascending:YES];
    25     
    26     NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];
    27     
    28     for(NSInteger i = 0; i < [tempArray count]; i++)
    29     {
    30         NSLog(@"%@--------%d
    ", [[tempArray objectAtIndex:i] name], [[tempArray objectAtIndex:i] age]);
    31     }
    32     
    33 //    [array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    34 //    
    35 //    for(NSInteger i = 0; i < [array count]; i++)
    36 //    {
    37 //        NSLog(@"%@--------%d
    ", [[array objectAtIndex:i] name], [[array objectAtIndex:i] age]);
    38 //    }

      NSSortDescriptor *sortDescriptor1 = [NSSortDescriptorsortDescriptorWithKey:@"_age"ascending:YES];

      NSSortDescriptor *sortDescriptor2 = [NSSortDescriptorsortDescriptorWithKey:@"_name"ascending:YES];

      NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArrayarrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];

    这里的NSArray中的第一元素表示首先按照这个元素的升序或者降序进行排序,对于有重复项的,再按照第二元素进行排序,依次进行类推

  • 相关阅读:
    No EntityManager with actual transaction available for current thread
    vue-router.esm.js?8c4f:16 [vue-router] missing param for named route "magneto.xmqsDx.edit": Expected "id" to be defined的解决办法
    运用equals来比对对象或者是对象集合的removeAll等是需要重写equals和hashCode,IDEA重写equals和hashCode
    本地连接远程rabbitMQ失败
    注解@Column实现实体类到数据库字段的映射以及解决映射过程中的type#[]类型错误
    Navicat激活工具激活方法
    Google浏览器主页被篡改(目标里没有网址)的解决办法--亲测有效
    css----transition的应用,产生动画效果。
    电信NBIOT 6
    电信NBIOT 5
  • 原文地址:https://www.cnblogs.com/ubersexual/p/3332639.html
Copyright © 2020-2023  润新知