zoukankan      html  css  js  c++  java
  • 数组排序(十三)

    数组排序

    oc提供了排序方法,但是这些排序方法,都是升序排序。

    NSArray排序

    sortedArrayUsingSelector:@selector(compare:),用方法选择器来选择比较方法,进行按照不同的条件进行排序。这里用的是compare方法用来比较字符串,然后进行排序。compare的参数,其实是在某个数组变量调sortedArrayUsingSelector这个方法的时候,compare就向这个数组的每一个元素都发送一个消息,这个消息就是compare方法,参数就是前一个元素跟后一个元素进行比较,如果结果>0则交换位置(类似冒泡排序),一直排好序为止。

            //排序

            NSArray *sortArr = [NSArray arrayWithObjects:@"3",@"2",@"1", nil];

            //按升序排好了

            //拿数组的第一个值和它后面的值比较,返回1时,交换位置(与冒泡类似)。

            //compare的参数是:数组当前数的后一个数。拿本数组来说就是@"2"就是compare的参数。@"3"与@"2"比较,给一个返回值(1,0,-1)

            //compare给数组的每一个元素都发消息。

            NSArray *temp11 = [sortArr sortedArrayUsingSelector:@selector(compare:)];

           

            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;

    }

  • 相关阅读:
    忙碌进度条
    WPF异步调用WCF
    Oracle 数据类型及存储方式(二)
    C# 与Oracle Data Type Mappings
    【CEO来信】任正非寄语2010:开放、妥协与灰度
    数据库数据类型
    asccii 表
    SQlServer2008 表结构查询
    Oracle 数据类型及存储方式(六)
    应用特征备份
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5118603.html
Copyright © 2011-2022 走看看