zoukankan      html  css  js  c++  java
  • 【转】 [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

    )

  • 相关阅读:
    Django入门
    Python从入门到放弃
    Python中的元类(metaclass)
    蓝鲸gse启动失败
    VS2019添加微软ReportViewer
    DevExpress WinForms各版本与 .NET、Visual Studio 的版本兼容性
    SQL语句查询每个分组的前N条记录的实现方法
    如何查看Windows安装版本号
    学习webpack
    Python3.x将代码打包成exe程序并添加图标
  • 原文地址:https://www.cnblogs.com/wi100sh/p/5733220.html
Copyright © 2011-2022 走看看