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

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

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

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

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

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

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

  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. NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
  9. NSLog(@"yi排序的数组:%@",sortedArray);
  10. /*
  11. 2013-11-29 08:28:00.616 OC实现学生成绩管理系统[451:303] 未排序的数组:(
  12. 10,
  13. 20,
  14. 0,
  15. 1,
  16. 3
  17. )
  18. 2013-11-29 08:28:00.621 OC实现学生成绩管理系统[451:303] yi排序的数组:(
  19. 0,
  20. 1,
  21. 3,
  22. 10,
  23. 20
  24. )
  25. */

同时也适用于类对象.

  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. -(NSComparisonResult)comparePerson:(Person *)person{
  10. //默认按年龄排序
  11. NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换
  12. //如果年龄一样,就按照名字排序
  13. if (result == NSOrderedSame) {
  14. result = [self.name compare:person.name];
  15. }
  16. return result;
  17. }

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

  1. -(void)SortStudentArray//
  2. {
  3. NSLog(@"按照学号排序请输入 (id)");
  4. NSLog(@"按姓名排序请输入(name)");
  5. NSLog(@"按照年龄排序请输入(age)");
  6. NSLog(@"按照成绩排序(score)请输入:");
  7. char charKey[10] ;
  8. scanf("%s",charKey);
  9. NSString *tempkey = [NSString stringWithUTF8String:charKey];
  10. NSString *key = [tempkey lowercaseString];
  11. BOOL ascending = NO;
  12. NSLog(@"是否开启降序模式( 默认不开启 )?(yes or no):");
  13. char ascendingStr[10] ;
  14. scanf("%s",ascendingStr);
  15. NSString *ascendingKey =[[NSString stringWithUTF8String:ascendingStr] lowercaseString];
  16. if ([ascendingKey isEqualToString:@"yes"])
  17. ascending = YES;
  18. else
  19. ascending = NO;
  20. if ([key isEqualToString:@"id"]) {
  21. NSSortDescriptor *sortByID = [NSSortDescriptor sortDescriptorWithKey:@"stuID" ascending:ascending];
  22. // 建立NSSortDescriptor 对象,按照的属性列,是否是asc升序?
  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. [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByName]];
  8. }
  9. else if([ key isEqualToString:@"age"])
  10. {
  11. NSSortDescriptor *sortByAge = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:ascending];
  12. [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByAge]];
  13. }
  14. else if ([key isEqualToString:@"score"])
  15. {
  16. NSSortDescriptor *sortByScore = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:ascending];
  17. [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByScore]];
  18. }
  19. }

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

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

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

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

    123,

    1bc,

    3ef,

    4b6,

    789

)

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

  1. OC知识梳理-NSArray与NSMutableArray相关知识

    知识普及: 1.数组中的元素在系统中都会有其默认对应的下标,下标是一个整形的数字,默认从0开始. 例:NSArray *arr3 = @["345","234" ...

  2. 黑马程序员——OC基础 三种特性之封装

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1)  set方法 1&g ...

  3. OC和JS交互的三种方法

    看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测.拦截Url地址实现互相调用的.剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法 ...

  4. OC与Swift混编,三种场景的实现方式

    多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...

  5. OC第三节——NSArray和NSMutableArray

    1.OC数组和c数组的区别        C语言的数组:            相同类型变量的有序结合. 类型:可以是简答数据类型.构造数据类型                int     a[10 ...

  6. NSArray,NSMutableArray的三种排序

    int main(int argc, const char * argv[]) { @autoreleasepool { //字符串进行排序 NSArray *arr=@[@"b" ...

  7. 利用 NSSortDescriptor 对 NSMutableArray 排序

    有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用Obj ...

  8. NSMutableArray 排序

    NSMutableArray *array1=[NSMutableArray arrayWithObjects:@"1",@"3",@"2" ...

  9. oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍

    一.类方法的使用 /* 像我们之前学的方法,必须先实例化这个类的对象才能调用这个方法,类方法不用实例化对象,直接调用这个方法. 之前学的方法调用的语法: [对象名 方法名]; //对象方法 类方法: ...

随机推荐

  1. 机器学习之神经网络模型-上(Neural Networks: Representation)

    在这篇文章中,我们一起来讨论一种叫作"神经网络"(Neural Network)的机器学习算法,这也是我硕士阶段的研究方向.我们将首先讨论神经网络的表层结构,在之后再具体讨论神经网 ...

  2. linux下文件编码的查看与修改

    在Linux中查看文件编码可以通过vim编辑器来查看,在vim命令模式下输入如下命令即可: :set fileencoding //在vim中查看文件编码 如果你只是想查看其它编码格式的文件或者想解决 ...

  3. 【XJOI-NOIP16提高模拟训练9】题解。

    http://www.hzxjhs.com:83/contest/55 说实话这次比赛真的很水..然而我只拿了140分,面壁反思. 第一题: 发现数位和sum最大就是9*18,k最大1000,那么su ...

  4. maven依赖的全局排除

    今天遇到要全局排除一个maven依赖,因为Maven本身没有全局排除依赖的办法, 参考了同事人英写的一篇博文(可以看这里http://my.oschina.net/liuyongpo/blog/177 ...

  5. 性能测试问题_Mysql数据库服务器的CPU占用很高

    MySQl服务器CPU占用很高 1.  问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 ...

  6. iOS开发--泛型

    一. 泛型函数 1.单一占位符泛型函数 下面就使用一个经典案例:两个数值进行交换.来使用泛型,写一个通用的函数,这个函数的功能就是交换两个变量的值.在Swift中不允许类型隐式转换,也就是说,如果你定 ...

  7. React组件生命周期-正确执行运行阶段的函数

    一. 二. <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" ...

  8. Android ScaleAnimation类:尺寸变化动画类

    ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类. ScaleAnimation类中的很多方法都与Animation ...

  9. eclipse安装Gradle

    第一步:下载Gradle>http://gradle.org/gradle-download 第二步:解压gradle-2.5, 配置环境变量:GRADLE_HOME path添加;%GRADL ...

  10. perl install module as non-root user

    install to local directory. 1. cpan 初始化,不用local::lib,mannual就行,其他auto2. 修改cpan 配置文件 cpan > o conf ...