oc提供了排序方法,可是这些排序方法,都是升序排序。数组
sortedArrayUsingSelector:@selector(compare:),用方法选择器来选择比较方法,进行按照不一样的条件进行排序。这里用的是compare方法用来比较字符串,而后进行排序。compare的参数,实际上是在某个数组变量调sortedArrayUsingSelector这个方法的时候,compare就向这个数组的每个元素都发送一个消息,这个消息就是compare方法,参数就是前一个元素跟后一个元素进行比较,若是结果>0则交换位置(相似冒泡排序),一直排好序为止。函数
//排序spa NSArray *sortArr = [NSArray arrayWithObjects:@"3",@"2",@"1", nil];orm //按升序排好了对象 //拿数组的第一个值和它后面的值比较,返回1时,交换位置(与冒泡相似)。排序 //compare的参数是:数组当前数的后一个数。拿本数组来讲就是@"2"就是compare的参数。@"3"与@"2"比较,给一个返回值(1,0,-1)继承 //compare给数组的每个元素都发消息。ip NSArray *temp11 = [sortArr sortedArrayUsingSelector:@selector(compare:)];ci
NSLog(@"%@",temp11);/*字符串 2015-04-17 16:16:02.855 OCLesson5_字典[2062:109720] ( 1, 2, 3 ) */ |
用的方法是:sortUsingSelector:@selector(),与NSArray的排序方式同样。
NSMutableArray *sortMArr = [NSMutableArray arrayWithArray:sortArr]; //升序排好的 [sortMArr sortUsingSelector:@selector(compare:)]; NSLog(@"%@",sortMArr);/*2015-04-17 16:18:47.561 OCLesson5_字典[2079:110645] ( 1, 2, 3 )*/ |
先介绍一个方法:description。当咱们在main函数中,或者在其余函数中打印一个自定义类对象数组时。输出的东西是:<CustomAlertView: 0x14643e30>没有获得咱们想要的东西,此时咱们就把父类继承过来的description进行重写(继承过来的方法不须要在.h文件里声明,直接在.m文件里重写便可),输出本身想要输出的对象名:
- (NSString *)description{ // return @"呵呵"; return [NSString stringWithFormat:@"name = %@,age = %ld",_name,_age]; } |
此时在打印自定义类对象数组时,打印出来的就是每一个元素的name = 和age =
仿造compare比较方法进行排序
用age来比较和用姓名来比较
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject{ NSString *_name; NSInteger _age; }
- (instancetype)initWithName:(NSString *)name age :(NSInteger)age;
- (NSInteger)age;
- (NSString *)name;
//仿照compare方法写的,用来比较 Person类型的两个对象。按照年龄排序 - (NSComparisonResult)compareUsingAge:(Person *)aPerson; //仿照compare方法写的,用来比较 Person类型的两个对象。按照姓名排序 - (NSComparisonResult)compareUsingName:(Person *)aPerson; @end |
Person.m
#import "Person.h"
@implementation Person - (instancetype)initWithName:(NSString *)name age :(NSInteger)age{ self = [super init]; if (self) { _name = name; _age = age ; } return self; } - (NSInteger)age{ return _age; }
- (NSString *)name{ return _name; } - (NSComparisonResult)compareUsingAge:(Person *)aPerson{ if (_age > aPerson.age) {//_age > aPerson.age,升序。_age < aPerson.age降序 return NSOrderedDescending;//枚举,值为1 交换位置 }else if(_age == aPerson.age){ return NSOrderedSame;//枚举,值为0 }else{ return NSOrderedAscending;//枚举,值为-1 } } - (NSComparisonResult)compareUsingName:(Person *)aPerson{ if ([_name compare:aPerson.name] == NSOrderedDescending) {//NSOrderedDescending为枚举值1, ==1升序,== -1 降序 return NSOrderedDescending; }else if ([_name compare:aPerson.name] == NSOrderedSame){//NSOrderedSame为枚举值0 return NSOrderedSame; }else{ return NSOrderedAscending;//NSOrderedAscending为枚举值 -1 } } @end |
main.m
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p1 = [[Person alloc]initWithName:@"white" age:15]; Person *p2 = [[Person alloc]initWithName:@"black" age:12]; Person *p3 = [[Person alloc]initWithName:@"green" age:34];
NSMutableArray *msArr = [NSMutableArray arrayWithObjects:p1,p2,p3, nil]; //仿照compare本身写的compareUsingAge:方法。 //升序 [msArr sortUsingSelector:@selector(compareUsingAge:)]; [msArr sortUsingSelector:@selector(compareUsingName:)];
for (Person *p in msArr) { NSLog(@"%@",p); } // NSLog(@"%@",p1); } return 0; } |