數組排序(十三)

 

數組排序

oc提供了排序方法,可是這些排序方法,都是升序排序。數組

 

NSArray排序

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

                             )

                             */

NSMutableArray排序

用的方法是: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

                               )*/

仿造compare比較方法對數組進行排序

先介紹一個方法: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;

}

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息