OC 数组排序方法论

来源:互联网 发布:多张表格数据汇总透视 编辑:程序博客网 时间:2024/04/30 19:57

OC对数组排序有很多种方法

首先声明一个Person类并重写父类的description方法 不会的同学请参照我的博客:

OC的开始(一)之----HelloWord与类的创建及使用

这里说一下重写的父类description方法:当我们不重写这个方法的时候,直接打印出得结果是对象,看代码:

        // 声明多个Person对象        Person *p1 = [Person personWithName:@"zhangsan" number:10001 age:26 score:90.5];        Person *p2 = [Person personWithName:@"lisi" number:10002 age:22 score:91.5];        Person *p3 = [Person personWithName:@"wangwu" number:10004 age:24 score:90.5];        Person *p4 = [Person personWithName:@"zhaoliu" number:10003 age:25 score:92.5];        Person *p5 = [Person personWithName:@"xiaoqi" number:10008 age:26 score:96.5];        Person *p6 = [Person personWithName:@"bazai" number:10006 age:27 score:93.5];        Person *p7 = [Person personWithName:@"xiaojiu" number:10005 age:21 score:92.5];        Person *p8 = [Person personWithName:@"shidi" number:10007 age:18 score:99.5];                // 声明一个不可变数组        NSArray *persons = [NSArray arrayWithObjects:p1, p2, p3, p4, p5, p6, p7, p8, nil];                NSLog(@"%@", persons);

2015-05-22 15:31:47.320 Test02[1653:116214] (    "<Person: 0x100200f80>",    "<Person: 0x100201270>",    "<Person: 0x1002012e0>",    "<Person: 0x100201350>",    "<Person: 0x1002013c0>",    "<Person: 0x100201430>",    "<Person: 0x1002014a0>",    "<Person: 0x100201510>")
这样执行的的显示结果是每一个元素对象在堆内存中站得地址,那么我们看看把description重写后再次打印的结果:

在Person.m文件中重写description方法

- (NSString *)description{    return [NSString stringWithFormat:@"name = %@ number = %ld age = %ld score = %.2f", _name, _number, _age, _score];}

然后打印结果:

2015-05-22 15:35:00.174 Test02[1669:117516] (    "name = zhangsan number = 10001 age = 26 score = 90.50",    "name = lisi number = 10002 age = 22 score = 91.50",    "name = wangwu number = 10004 age = 24 score = 90.50",    "name = zhaoliu number = 10003 age = 25 score = 92.50",    "name = xiaoqi number = 10008 age = 26 score = 96.50",    "name = bazai number = 10006 age = 27 score = 93.50",    "name = xiaojiu number = 10005 age = 21 score = 92.50",    "name = shidi number = 10007 age = 18 score = 99.50")

很明显,当我们直接打印数组的时候,系统调用了父类的description方法。

现在开始我们的排序之旅:

一、使用冒泡排序:

        // 定义一个可变数组,将persons的值赋给可变数组        NSMutableArray *muPersons = [NSMutableArray arrayWithArray:persons];                // 使用冒泡按照number进行升序排序        for (int i = 0; i < muPersons.count - 1; i++) {            for (int j = 0; j < muPersons.count - 1 - i; j++) {                // 前一个元素的number属性大于后一个元素的number属性时 两个元素交换位置                if ([muPersons[j] number] > [muPersons[j + 1] number]) {                    [muPersons exchangeObjectAtIndex:j withObjectAtIndex:j + 1];                }            }        }        NSLog(@"%@", muPersons);
查看结果:

2015-05-22 15:50:26.322 Test02[1719:122150] (    "name = zhangsan number = 10001 age = 26 score = 90.50",    "name = lisi number = 10002 age = 22 score = 91.50",    "name = zhaoliu number = 10003 age = 25 score = 92.50",    "name = wangwu number = 10004 age = 24 score = 90.50",    "name = xiaojiu number = 10005 age = 21 score = 92.50",    "name = bazai number = 10006 age = 27 score = 93.50",    "name = shidi number = 10007 age = 18 score = 99.50",    "name = xiaoqi number = 10008 age = 26 score = 96.50")
二、使用sortedArrayUsingSelector排序:

使用sortedArrayUsingSelector之前,需要我们在person中写专门写一个排序的方法供sortedArrayUsingSelector使用。

在person.h文件中自定义排序方法compareSortNumber:

// 自定义排序方法- (NSComparisonResult)compareSortNumber:(Person *)person;
在person.m文件中实现排序:

// 自定义排序方法- (NSComparisonResult)compareSortNumber:(Person *)person{    if ([self number] > [person number]) {        return NSOrderedDescending;    }    return NSOrderedSame;}
在main.m文件中调用sortedArrayUsingSelector对number进行升序排列

        // 使用sortedArrayUsingSelector对number进行升序排列        NSArray *selArray = [persons sortedArrayUsingSelector:@selector(compareSortNumber:)];        NSLog(@"%@", selArray);
运行结果:

2015-05-22 16:33:49.996 Test02[1927:136447] (    "name = zhangsan number = 10001 age = 26 score = 90.50",    "name = lisi number = 10002 age = 22 score = 91.50",    "name = zhaoliu number = 10003 age = 25 score = 92.50",    "name = wangwu number = 10004 age = 24 score = 90.50",    "name = xiaojiu number = 10005 age = 21 score = 92.50",    "name = bazai number = 10006 age = 27 score = 93.50",    "name = shidi number = 10007 age = 18 score = 99.50",    "name = xiaoqi number = 10008 age = 26 score = 96.50")
三、使用sortedArrayUsingComparator对number进行升序排列

        // 使用sortedArrayUsingComparator对number进行升序排列        NSArray *comArray = [persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {            Person *p1 = obj1;            Person *p2 = obj2;                        if ([p1 number] > [p2 number]) {                return NSOrderedDescending;            }            return NSOrderedSame;        }];        NSLog(@"%@", comArray);
运行结果:

2015-05-22 17:02:44.189 Test02[2039:148253] (    "name = zhangsan number = 10001 age = 26 score = 90.50",    "name = lisi number = 10002 age = 22 score = 91.50",    "name = zhaoliu number = 10003 age = 25 score = 92.50",    "name = wangwu number = 10004 age = 24 score = 90.50",    "name = xiaojiu number = 10005 age = 21 score = 92.50",    "name = bazai number = 10006 age = 27 score = 93.50",    "name = shidi number = 10007 age = 18 score = 99.50",    "name = xiaoqi number = 10008 age = 26 score = 96.50")
总结:

         使用冒泡排序的时候 我们需要重新定义可变数组对数组中的元素进行排序,sortedArrayUsingSelector排序我们需要写单独写一个方法给sortedArrayUsingSelector调用,太麻烦了,最后一种方法是OC中最常用的排序方法。

1 0
原创粉丝点击