Object-C排序的几种方法

原创 2015年11月18日 21:35:34

方法一
利用系统自带的排序方法:

- (NSArray<ObjectType> *)sortedArrayUsingSelector:(SEL)comparator;
  NSArray *array = [NSArray arrayWithObjects:@"1",@"9",@"3",@"4",@"2", nil];
  array = [array sortedArrayUsingSelector:@selector(compare:)];//系统自带
  NSLog(@"%@",array);
  注意:也可以重写compare:方法如下所示

  **方法二 自定义方法,用选择器(类似于C语言的回调函数)进行排序**
  Person.m
@implementation Person
+(Person *)personWithName:(NSString *)name age:(int)age{
    Person *p = [[Person alloc]init];
    p.age = age;
    p.name = name;

    return p;
}
-( NSComparisonResult)comparePerson:(Person *)p{
    NSComparisonResult re = [[NSNumber numberWithInt:[p age]] compare:[NSNumber numberWithInt:[self age]]];
    if (re == NSOrderedSame) {
        re = [self.name compare:p.name];
    }
    return re;
}
-(void) sortArray2{
    Person *p1 = [Person personWithName:@"zhangsan" age:12];
    Person *p2 = [Person personWithName:@"zhangen" age:12];
    Person *p3 = [Person personWithName:@"zhangat" age:12];
    Person *p4 = [Person personWithName:@"zhangsrg" age:12];

    NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4, nil];
    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(comparePerson:)];
    NSLog(@"排序后:%@",sortedArray);
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@,%d", self.name,self.age];
}
@end

这里写图片描述
方法三 利用Block进行排序

 NSArray *array = [NSArray arrayWithObjects:@"1",@"9",@"3",@"4",@"2", nil];

        NSComparator res = ^(id obj1, id obj2){

            return [obj1 compare:obj2];//直接比较
//            if ([obj1 integerValue] > [obj2 integerValue]) {// 转换成整型值,在进行比较
//                return -1L;
//            }else
//                return 1L;
        };
        array = [array sortedArrayUsingComparator:res];
        NSLog(@"%@",array);

这里写图片描述

方法四 高级排序
person.m

#import "Person.h"
#import "Car.h"
@implementation Person
+(Person *)personWithName:(NSString *)name age:(int)age{
    Person *p = [[Person alloc]init];
    p.age = age;
    p.name = name;

    return p;
}
-(instancetype)initWithName:(NSString *)name age:(int)age car:(Car *)car{
    if (self = [super init]) {
        self.name = name;
        self.age =age;
        self.car = car;
    }
    return self;
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@,%d,%@", self.name,self.age,self.car];
}
-(void) sortArray2{
    Car * c1= [[Car alloc]initWitnName:@"1"];
    Car * c2= [[Car alloc]initWitnName:@"2"];
    Car * c3= [[Car alloc]initWitnName:@"3"];
    Car * c4= [[Car alloc]initWitnName:@"4"];
    Person *p1 = [[Person alloc]initWithName:@"z"age:34 car:c1];
    Person *p2 = [[Person alloc]initWithName:@"r" age:12 car:c2];
    Person *p3 = [[Person alloc]initWithName:@"a" age:17 car:c3];
    Person *p4 = [[Person alloc]initWithName:@"c"age:87 car:c4];
    NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4, nil];
    //构建排序描述器
    NSSortDescriptor *carNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"car.name" ascending:YES];
   // NSSortDescriptor *personNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
   // NSSortDescriptor *personAgeDesc = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
   // NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc, nil];//结果(按年龄排序1)
     // NSArray *descriptorArray = [NSArray arrayWithObjects:personNameDesc, nil];// 结果(按人的名字排序2)
            NSArray *descriptorArray = [NSArray arrayWithObjects:carNameDesc, nil];// 结果(按car的名字排序3)

    NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];
    NSLog(@"%@",sortedArray);
}

@end

Car.m

#import "Car.h"

@implementation Car
-(instancetype)initWitnName:(NSString *)name{
    if (self = [super init]) {
        self.name = name;
    }
    return self;
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@", self.name];
}
@end

结果(按年龄排序1)

这里写图片描述
结果(按人的名字排序2)
这里写图片描述
结果(按car的名字排序3)
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

Object-C基础--输入5个字符串并排序

//输入5个只包含字母或者数字的字符串,对其排序 // // main.m // 笔试练习 // // Created by smartlei on 15/6/29. // Copyright...
  • crt3d14e5
  • crt3d14e5
  • 2015年06月29日 14:40
  • 438

给object数组进行排序(排序条件是每个元素对象的属性个数)

示例数据: var book={ page:400 } var car={ color:"red", door:"four" } var person={ na...
  • du_peiduo
  • du_peiduo
  • 2015年09月09日 16:57
  • 2287

Object.keys()js 把对象按照属性名的字母顺序进行排列

js 把对象按照属性名的字母顺序进行排列 var obj = {name: "zhangsan", age: 8, ace: 5, nbme: "lisi"};//要排序的对象 functio...
  • sinat_17775997
  • sinat_17775997
  • 2016年08月24日 09:49
  • 8561

js中对象属性值排序(字典倒排序)

[TOC] 教女朋友前端js的过程中发现好多书里面都没有讲倒排序,网上搜了也没有,故此新开一文讲一下。sort函数先说一下sort函数:var a=[3,2,5,7,3,6,8,9,1,2]; do...
  • trucyluce
  • trucyluce
  • 2016年03月20日 17:26
  • 15831

Objective-C实现常用的4种排序算法

OC实现的4种排序又来了! 4种排序分别是:快速排序、冒泡排序、选择排序、插入排序,其他的我就不写了,因为OC里的数组中不能存放基本数据类型,如int不能存放,只能放对象,所以所有的数据我用了N...
  • u011266870
  • u011266870
  • 2016年11月28日 17:53
  • 208

Object-C基础--输入5个字符串并排序

//输入5个只包含字母或者数字的字符串,对其排序 // // main.m // 笔试练习 // // Created by smartlei on 15/6/29. // Copyright...
  • crt3d14e5
  • crt3d14e5
  • 2015年06月29日 14:40
  • 438

List<Object>集合按照Object的某个字段排序,解决取不到父类字段问题

最近在做一个项目,里边有大量的排序需求,神烦!如果每个排序需求都做一个接口的话,那样工作量就太大了,所以就要有一个通用一些的排序工具类,来解决排序问题。由于排序需求很大一部分都是List集合排序,所以...
  • hao_kkkkk
  • hao_kkkkk
  • 2016年07月15日 11:17
  • 1817

List<Object>根据Object里的2个属性排序

List根据Object里的2个属性排序
  • u011493599
  • u011493599
  • 2016年09月23日 11:33
  • 1145

C#基础之数组排序,对象大小比较

C#基础之数组排序,对象大小比较
  • netuser1937
  • netuser1937
  • 2016年12月09日 11:08
  • 311

js中对象属性值排序(字典倒排序)

[TOC] 教女朋友前端js的过程中发现好多书里面都没有讲倒排序,网上搜了也没有,故此新开一文讲一下。sort函数先说一下sort函数:var a=[3,2,5,7,3,6,8,9,1,2]; do...
  • trucyluce
  • trucyluce
  • 2016年03月20日 17:26
  • 15831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C排序的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)