zoukankan      html  css  js  c++  java
  • 数组内部对象排序(sort)

    1.数组排序有很多方法比如for,while循环去进行冒泡排序或者快速看、排序等多种排序方法

     而我在这里要说的是苹果API提供的几个系统方法

      a.迭代器     Descriptor

      b.方法比较  Selector

      c.函数比较  Function

      d.块代码    Block自定义

    2.示例

      1.1一个要比较对象的类(Person)

    @interface Person : NSObject
    
    @property(nonatomic , copy)NSString * name;
    
    @property(nonatomic , copy)NSString * phone;
    
    @property(nonatomic , assign)int age;
    
    @end
    

     1.2自定义几个Person对象(在其他类中)

        Person *person1 = [[Person alloc] init];
        person1.name = @"gulong";
        person1.age = 23;
        
        Person *person2 = [[Person alloc] init];
        person2.name = @"guzheng";
        person2.age = 24;
        
        Person *person3 = [[Person alloc] init];
        person3.name = @"zhangsan";
        person3.age = 21;
        
        Person *person4 = [[Person alloc] init];
        person4.name = @"lisi";
        person4.age = 25;
        
        NSArray *originalArray = @[person1,person2,person3,person4];
    

     1.3排序开始

        1.3.1 使用迭代器进行排序

            使用NSSortDescriptor可以很方便的进行多条件排序

        NSSortDescriptor *sorter1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
        NSSortDescriptor *sorter2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];
        NSArray *modifyArray1 = [originalArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sorter1,sorter2,nil]];
    

           //首先通过name的字母进行升序排序,然后进行age大小比较进行降序排序

          //数组通过sortedArrayUsingDescriptors可以进行多重排序(就是相等时就进行下一个比较迭代器)

        1.3.2 使用SEL方法排序

           首先需要在对象类里面定义并且在实现类里面实现这一方法(OC方法),该方法返回一个NSComparisonResult的枚举值(其实就是-1,0,1),然后NSArray调用sortedArrayUsingSelector这个方法时内部会进行相应的比较排序

    Person.h
    - (NSComparisonResult)compareAgeAscende:(id)other;
    Person.m
    - (NSComparisonResult)compareAgeAscende:(id)other { Person *otherPerson = (Person *)other; if (self.age > otherPerson.age) { return NSOrderedDescending; }else{ if (self.age == otherPerson.age) { return NSOrderedSame; }else{ return NSOrderedAscending; } } }

              下面是调用 sortedArrayUsingSelector

    ViewController  (- (void)viewDidLoad)
      NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector:@selector(compareAgeAscende:)];
      NSLog(@"modifyArray2 : %@",modifyArray2);
    

          注: a.当数组里面对象是NSString时可以用compare:进行sel比较

         1.3.3 函数比较  该函数是一个比较函数(C语言),该函数同样是放回NSComparisonResult这个枚举,其实就是一个NSInteger的整数,然后NSArray调用sortedArrayUsingFunction这个方法时内部会进行相应的比较排序    

    // 定义在viewController里面(其实定义在哪里无所谓,主要是可以调用到就行)
    NSInteger personSort(id obj1,id obj2 ,void * context){
        Person *person1 = (Person *)obj1;
        Person *person2 = (Person *)obj2;
        return [person1.name localizedCompare:person2.name];
    }
    
    NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context:NULL];
        NSLog(@"modifyArray3 : %@",modifyArray3);
    

         1.3.4 block比较 该block里面定义写一个比较的代码块,该代码块同样返回NSComparisonResult这个枚举

    NSArray *modifyArray4 = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            Person *pers1 = (Person *)obj1;
            Person *pers2 = (Person *)obj2;
            if (pers1.age > pers2.age) {
                return NSOrderedDescending;
            }else if (pers1.age < pers2.age){
                return NSOrderedAscending;
            }else{
                return NSOrderedSame;
            }
        }];
        NSLog(@"modifyArray4 : %@",modifyArray4);

       1.4 字符串(带汉字)转拼音字符串 (为了上面的比较问题,为了更多需求)

    - (NSString *) phonetic:(NSString*)sourceString {
        NSMutableString *source = [sourceString mutableCopy];
        CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO);
        CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO);
        return source;
    }
    //汉字转拼音后会以空格隔开
  • 相关阅读:
    每日日报2021.5.14
    每日日报2021.5.13
    每日日报2021.5.12
    每日日报2021.5.11 冲刺第十天
    《梦断代码》读后感3
    每日日报2021.5.10 冲刺第九天
    《梦断代码》读后感2
    每日日报2021 5/23
    每日日报2021 5/22
    每日日报2021 5/21
  • 原文地址:https://www.cnblogs.com/gulong/p/4551125.html
Copyright © 2011-2022 走看看