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; } |