美文网首页
数组排序

数组排序

作者: wpf_register | 来源:发表于2020-06-08 10:31 被阅读0次

    首先明确两个定义

    1.定义NSComparisonResult类型返回值
    typedef NS_ENUM(NSInteger, NSComparisonResult)
    {
        //代表升续
        NSOrderedAscending = -1L,    
        //代表相同
        NSOrderedSame,
        //代表降序                      
        NSOrderedDescending        
    };
    
    2.定义NSComparator block类型返回值
     typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
    
    block进行排序(推荐使用)
    NSMutableArray *arr = [NSMutableArray array];
    
    [arr addObject:@2];
    [arr addObject:@1];
    [arr addObject:@5];
    [arr addObject:@3];
    [arr addObject:@4];
    
    //此方法是直接对arr排序,若要生成新数组排序则调用sortedArrayUsingComparator:
    //若明确知道数组中元素的类型,也可以直接将id改为某确定类型
    [arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2)
    {
        //此处的规则含义为:若前一元素比后一元素小,则返回降序(即后一元素在前,为从大到小排列)
        if ([obj1 integerValue] < [obj2 integerValue])
        {
            return NSOrderedDescending;
        }
        else
        {
            return NSOrderedAscending;
        }
    }];
    
    排序结果为 5,4,3,2,1
    
    

    NSString类比较方法:
    pare:区分大小写
    caseInsensitiveCompare: 不区分大小写
    localizedStandardCompare:根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)

    NSString *value = @”1234567890”;
    
    比较的方法: 
    [value compare:(NSString *)]; 
    [value compare:(NSString *) options:(NSStringCompareOptions)]; 
    [value compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];
    
    range:(NSRange) 
    比较字符串的范围
    
    options:(NSStringCompareOptions) 
    传入 NSStringCompareOptions 枚举的值 
    enum{ 
    NSCaseInsensitiveSearch = 1,#不区分大小写比较 
    NSLiteralSearch = 2,#区分大小写比较 
    NSBackwardsSearch = 4,#从字符串末尾开始搜索 
    NSAnchoredSearch = 8,#搜索限制范围的字符串 
    NSNumbericSearch = 64#按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt 
    }
    
    
    
    SEL排序
    NSMutableArray *arr = [NSMutableArray array];
    
    for (NSInteger i = 0; i < 5; i++)
    {
        Student *stu = [Student new];
        //生成10-20的随机数
        stu.age = arc4random_uniform(10) + 10;
        [arr addObject:stu];
    }
    
    #此处的sel应该理解为对数组中A对象调用自己的sel,传入值为B对象,同时返回值为NSComparisonResult
    [arr sortUsingSelector:@selector(compareWithStu:)];
    

    Student对象必须有一个自定义比较方法进行排序。
    此方法必须有一个传入值(传入Student对象用以比对)和
    一个返回值(NSComparisonResult类型)。

    Student具体如下
    
    .h
    @interface Student : NSObject
    @property (assign, nonatomic) NSInteger age;
    /** 排序规则*/
    - (NSComparisonResult)compareWithStu:(Student *)stu;
    @end
    
    .m
    @implementation Student
    /** 排序规则*/
    - (NSComparisonResult)compareWithStu:(Student *)stu
    {
        //按照升续排列
        if (self.age > stu.age)
        {
            return NSOrderedDescending;
        }
        else if (self.age == stu.age)
        {
            return NSOrderedSame;
        }
        else
        {
           return NSOrderedAscending;
        }
    }
    @end
    
    某次运行结果为
    (
        "age -> 10",
        "age -> 12",
        "age -> 12",
        "age -> 18",
        "age -> 19"
    )
    

    相关文章

      网友评论

          本文标题:数组排序

          本文链接:https://www.haomeiwen.com/subject/mkcltktx.html