【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).

原文网址:http://blog.csdn.net/ministarler/article/details/17018839

c语言实现的学生成绩管理系统是面向过程的,而OC实现的学生成绩管理系统则是面向对象的.

对该系统的重难点讲述如下:

1.排序.系统中的四个关键字分别是 stuID,姓名,年龄,成绩.我们可以选择这四种方式并选择 升降序的方法进行排序.

系统中使用的是  NSmutableArray 存储数据.那么如何对对象是类成员的数组排序呢?

先看看NSMutableArray排序的几种方式.

1)使用@Seletor选择器调用方法排序.

[objc] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. NSMutableArray *array = [[NSMutableArray alloc]init];  
  2.     [array addObject:[NSNumber numberWithInt:10]];  
  3.     [array addObject:[NSNumber numberWithInt:20]];  
  4.     [array addObject:[NSNumber numberWithInt:0]];  
  5.     [array addObject:[NSNumber numberWithInt:1]];  
  6.     [array addObject:[NSNumber numberWithInt:3]];  
  7.     NSLog(@"未排序的数组:%@",array);  
  8.       
  9.     NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];  
  10.      NSLog(@"yi排序的数组:%@",sortedArray);  
  11.     /* 
  12.      2013-11-29 08:28:00.616 OC实现学生成绩管理系统[451:303] 未排序的数组:( 
  13.      10, 
  14.      20, 
  15.      0, 
  16.      1, 
  17.      3 
  18.      ) 
  19.      2013-11-29 08:28:00.621 OC实现学生成绩管理系统[451:303] yi排序的数组:( 
  20.      0, 
  21.      1, 
  22.      3, 
  23.      10, 
  24.      20 
  25.      ) 
  26.      */  

同时也适用于类对象.

[objc] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //直接实现静态方法,获取带有name和age的Person对象  
  2. +(Person *)personWithAge:(int) age withName:(NSString *)name{  
  3.     Person *person = [[Person alloc] init];  
  4.     person.age = age;  
  5.     person.name = name;  
  6.     return person;  
  7. }  
  8.   
  9. //自定义排序方法  
  10. -(NSComparisonResult)comparePerson:(Person *)person{  
  11.   //默认按年龄排序  
  12.     NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换  
  13.   //如果年龄一样,就按照名字排序  
  14.     if (result == NSOrderedSame) {  
  15.         result = [self.name compare:person.name];  
  16.     }  
  17.     return result;  
  18. }  




2.高级排序,使用排序描述器:使用descriptor方法对Array中成员是类对象的类型进行按@propery 列进行排序.

  

[objc] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. -(void)SortStudentArray//   
  2. {  
  3.     NSLog(@"按照学号排序请输入 (id)");  
  4.       
  5.     NSLog(@"按姓名排序请输入(name)");  
  6.       
  7.     NSLog(@"按照年龄排序请输入(age)");  
  8.       
  9.     NSLog(@"按照成绩排序(score)请输入:");  
  10.       
  11.     char charKey[10] ;  
  12.     scanf("%s",charKey);  
  13.       
  14.     NSString *tempkey = [NSString stringWithUTF8String:charKey];  
  15.     NSString *key = [tempkey lowercaseString];  
  16.       BOOL ascending = NO;  
  17.     NSLog(@"是否开启降序模式( 默认不开启 )?(yes or no):");  
  18.     char ascendingStr[10] ;  
  19.     scanf("%s",ascendingStr);  
  20.     NSString *ascendingKey =[[NSString stringWithUTF8String:ascendingStr] lowercaseString];  
  21.       
  22.     if ([ascendingKey isEqualToString:@"yes"])  
  23.         ascending = YES;  
  24.     else  
  25.         ascending = NO;  
  26.       
  27.       
  28.     if ([key isEqualToString:@"id"]) {  
  29.          
  30.         NSSortDescriptor *sortByID = [NSSortDescriptor sortDescriptorWithKey:@"stuID" ascending:ascending];  
  31.        // 建立NSSortDescriptor 对象,按照的属性列,是否是asc升序?  
[objc] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByID]];  
  2.         //按照建立的descriptor进行排序.  
  3.     }  
  4.     else if([key isEqualToString:@"name"])  
  5.     {  
  6.         NSSortDescriptor *sortByName= [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:ascending];  
  7.           
  8.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByName]];  
  9.   
  10.       
  11.     }  
  12.     else if([ key isEqualToString:@"age"])  
  13.     {  
  14.         NSSortDescriptor *sortByAge = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:ascending];  
  15.           
  16.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByAge]];  
  17.   
  18.       
  19.     }  
  20.     else if ([key isEqualToString:@"score"])  
  21.     {  
  22.         NSSortDescriptor *sortByScore = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:ascending];  
  23.           
  24.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByScore]];  
  25.   
  26.       
  27.     }  
  28.   
  29.   
  30. }  

上述代码就是我在管理系统中实现的,结果将在系统中呈现.

3.自定义重写方法进行排序.使用Block进行排序.

[objc] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil nil];  
  2.        NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {  
  3.              
  4.            //这里的代码可以参照上面compare:默认的排序方法,也可以把自定义的方法写在这里,给对象排序  
  5.            NSComparisonResult result = [obj1 compare:obj2];  
  6.            return result;  
  7.        }];  
  8.        NSLog(@"排序后:%@",sortedArray);  

2013-11-29 08:42:56.723 OC实现学生成绩管理系统[483:303] 排序后:(

    123,

    1bc,

    3ef,

    4b6,

    789

)

原文地址:https://www.cnblogs.com/wi100sh/p/5733220.html