新普金娱乐网址


那一个年虐我千百遍的名师,地理你们好呀!

初入小学

数学iOS开发·必会的算法操作:字符串数组排序+模型对象数组排序

  • 一月 02, 2019
  • 数学
  • 没有评论

Leader分外中意这么些特效,说要在大家app中动用,问我能无法促成,我一看这个特效,卧槽,涉及了广大技术点,实现难度很大。假诺是和谐做特效还好,模仿外人的特效,做的粗糙没什么,如若要做得好,就得考虑好多细节。身为爱人,怎么能说不行,自己给协调安排时间,偷偷搞,经过了几天的不方便奋战,终于形成了,开森。
可知成功这么些特效,感谢他,感谢她,感谢依旧帮助自己的人。

1.1 字符串数组排序示例

2017-12-20

2.2.2 NSCaseInsensitiveSearch

合法解释:无。英文字面解释:不区分字母大小写。

  • 假定,将上例中的部分代码修改为

NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch; 
  • 运行结果

image.png

  • 结论
    NSStringCompareOptions指定为NSCaseInsensitiveSearch,不区分同一个字母的大小写情状,如aA作为相同元素,若其他条件也一样则维持原序。

闪闪金服 – 杨毅辉

2.2.7 误导用法
  • 本人看过有无数任何博客用了那样的误导示例:

NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch|NSNumericSearch|NSWidthInsensitiveSearch|NSForcedOrderingSearch;

这其中,NSCaseInsensitiveSearch是为着不区分轻重缓急写字母,可是前面再加个NSForcedOrderingSearch想强制区分字符又是怎么回事?即便,这样写并不会报错,运行效果跟上边的汇总示范一摸一样。但这样误导的想法是个逻辑顶牛。不信,你看看它运行的结果:

image.png

那就是说,说干就干

姣好这么些特效此前,首先是要采用实现工具,实现工具的挑选很关键,相当于方向,方向选对了,才能使上大力气。
贯彻工具有3种:

1、自定义滚动视图
2、UIScrollView
3、UICollectionView

首先种,使用自定义滚动视图,亲自去Github下边找了无数有关自定义滚动视图的demo,觉得难度不是形似的难,而是二班的难呐,想着知乎的iOS开发程度应该也没那么强,肯定不是这种方案,就Pass了第一种。
那么看下第两种,使用UIScrollView,苹果自己弄的UIScrollView,能够分页是足以分页,不过只好整个视图分页,不可能到位区域分页,看了许多的Demo,实现效益也不自鸣得意,无奈Pass了第二种。
这就是说第二种呢?使用UICollectionView,在网上找到了累累得以提供灵感的Demo,感觉上是可行的,然后伟哥给了接近的Demo告诉自己这种方案的大势。可以的,那就用这种办法搞起。

前方的话

为了给字符串数组排序,除了用C/C++的骨干方法,iOS开发者更应有学会使用苹果专门为NSArray
排序提供的sortedArrayUsingComparator 方法:

- (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr NS_AVAILABLE(10_6, 4_0);

中间,需要设置一个NSComparator 参数,它是一个block,查看定义如下:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

以此block体重返的NSComparisonResult 是一个枚举类型,它的概念是:

typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};

题材来了,怎么设置?

  • 为了设置这一个NSComparator数学,
    参数的block体,你可以在装置其block体的时候,手动再次来到一个NSComparisonResult
    枚举类型的某个具体值(NSOrderedAscending, NSOrderedSame,
    NSOrderedDescending 三选一):

image.png

  • 只要数组里面是字符串,在安装其block体的时候,你也能够使用苹果专门为NSString
    提供的字符串相比较艺术,得到一个NSComparisonResult
    类型,将其活动重临。

- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale; // locale arg used to be a dictionary pre-Leopard. We now accept NSLocale. Assumes the current locale if non-nil and non-NSLocale. nil continues to mean canonical compare, which doesn't depend on user's locale choice.

image.png

此刻,就需要领悟NSStringCompareOptions
的意思。但假若您追寻一下NSStringCompareOptions
,会发现许多稿子中的翻译或者粤语讲演在误导,或者很难看清什么看头?例如上边这篇博客:

image.png

下一场,相同的解释文案还以讹传讹的传入来了,例如你看下边这多少个博客:

image.png

于是乎,笔者决定写此本文,好好显示他们的用途。

规定好了大方向之后就努力了。

题材1:中间的滚动视图是一块一块移动的,截至时偏离中间目前的卡片会自动滑动到中游,居中对齐。
UICollectionView有个布局类叫做UICollectionViewFlowLayout,可以在内部实现卡片效果,通过测算每个可见Cell到中间地点,来总结出偏移量,得出CollectionView最后停留的地点,实现机关滑动到中游,居中对齐的效用。实现以下模式:

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity

题材2:中间的滚动视图在滑行的时候发现卡片是叠在一块儿的,中间的在上层,其他部分在下层,遵照距离中间地点的远近年来区分上下层。
看UICollectionViewFlowLayout布局文件,通过总括可见Cell到骨干点地点,来确定Cell的职务,达到叠加的效率。上下层的定义则是通过z轴的例外来实现,搞过游戏的爱人或者会更明了部分,三维坐标系中有x轴,y轴,z轴,通过z轴确定视图的光景层次。实现以下方法:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds

问题3:中间的滚动视图在滑行的时候发现卡片大小不雷同,中间的最大,越靠近边框越小。
在UICollectionViewFlowLayout布局文件中化解,设置好垂直缩放全面,依照距离的远近举行推广处理,距离中间的放权最大。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

题材4:中间的滚动视图在滑行的时候发现滑动的离开和卡片移动的偏离并不是成正比,而是按照持续变化的加速度移动的。
在UICollectionViewFlowLayout布局文件中解决,遵照可见Cell到中央的不等地方设置移动距离,不同的离开使用不同的加速度。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

题材5:中间的轮转视图滑到左左边缘时视图透明度改变。
在UICollectionViewFlowLayout布局文件中解决,通过测算边缘距离,来动态改变透明度。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

问题6:循环滚动方案的兑现
关于循环滚动方案,网上的布道见怪不怪。我从前也搞过巡回滚动,中间显示3个,使用5个视图举办巡回滚动。但这种方案总结相比复杂,功力不够的伙伴依旧不要品味的好。还有一种方案是足以让它滚动到结尾一格的时候,跳转到第一格,这种方案有点不是很通畅。最后我利用了中档定位法实现了循环滚动,需要采取下边的措施:

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];

问题7:上下滑动表格时,中间的轮转视图要随着一块儿滑动,上滑时向左移动,下滑时向右移动。
内需在表格类中滚动代理方法里面安装滚动时设置UICollectionView的ContentOffset偏移量,然后在scrollViewDidEndDragging和scrollViewDidEndDecelerating六个法子中设置滚动为止后,UICollectionView的ContentOffset偏移量,需要总括到屏幕中间地点的偏移量举行偏移。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

题目8:左右晃动手机时,中间的轮转视图要随之一块滑动,向左晃动时卡片向左移动,向右晃动时卡片向右移动。
摇荡手机,涉及到硬件支撑。红米手机内布置了各个传感器,其中一个就是重力影响。通过询问引力感应,知道了加速器,使用加速器来决定晃动偏移量,发现效果不好,抖动特别厉害,在网上也从不特意好的事例表明。那么改用陀螺仪,苹果的陀螺仪做的不胜精细,效果也很好,非常安静,不过又发现了新题材,就是活动截至不了。最后在加速器和陀螺仪的配合之下,终于完满的缓解了问题。

- (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler
- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler

问题9:需要保证刚才提到的3种控制方法互不苦恼。
论及到标准判断,不仅需要在表格的UIScrollView代理方法做决定,还要在UICollection代理方法做决定,保证效用互不苦恼。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

做到将来的效益如下:

自己做的卡片滚动特效

假诺是依照网易情报的还简要一点,可是问题是,我们的成品接连会搞点花样,比如修改透明度,修改圆角呀,等等,所以实现的难度就充实了无数。不言而喻,兵来将挡水来土掩,完成就是了。

尾记:有人说服务端比客户端强,并非如此。闻道有先后,术业有专攻,不同的人,Level也不同。做接口考虑大数额,考虑数据库结构,查询优化等等,这多少个简单无非如故工具、数学、逻辑思考、数据结构、算法,跟客户端差不多。客户端也要考虑代码框架设计、网络框架设计、数据库设计、特效空间数学总计、逻辑处理、数据结构、算法等等。客户端做的强的人,转到服务端也是分分钟搞定的事。

——————————-我是分割线——————————-

2. 次之种:数组的字符串元素里面不是着力数据类型


供销社项目:找到停止,采纳了那多少个特效,已披露在App
Store,欢迎下载查看。

2.1.1 实验代码
  • main.m

//
//  main.m
//  SortingForArray
//
//  Created by ChenMan on 2017/12/20.
//  Copyright © 2017年 ChenMan. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <stdio.h>

void handleSortingForStrArray(void){
       NSArray *stringsArray = [NSArray arrayWithObjects:
                             @"string b",
                             @"string A",
                             @"string a",
                             @"string \uFF41",
                             @"string a",
                             @"string A",
                             @"string c",
                             @"string d0030",
                             @"string d2",
                             @"アいろはアイウエイウエ",
                             @"アいろはアイウエイウエ",
                             @"アいろはアイウエイウエ",nil];

    NSLocale *currentLocale = [NSLocale currentLocale];
    NSComparator finderSortBlock = ^(id string1,id string2) {

        NSRange string1Range =NSMakeRange(0, [string1 length]);
        return [string1 compare:string2 options:nil range:string1Range locale:currentLocale];
    };

    NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
    NSLog(@"finderSortArray: %@", finderSortArray);

}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Results of handleSortingForStrArray()**********************");
        handleSortingForStrArray();
    }
    return 0;
}

进入正题

先看下网易的特效(版本 v6.6.0)

知乎快讯首页卡片滚动特效

先分析一下这些滚动特效,有3种方法控制滚动:

1、1个是手指上下滑动整个表格,中间的滚动视图会跟着一起步。
2、1个是左右滑行中间的轮转视图,滚动视图会快捷滑动。
3、1个是左右晃出手机,按照角度不同,滚动视图跟着一起动。

亟待缓解广大题目:

1、中间的轮转视图是一块一块移动的,结束时偏离中间如今的卡片会自动滑动到中游,居中对齐。
2、中间的轮转视图在滑行的时候发现卡片是叠在一块的,中间的在上层,其他一些在下层,按照距离中间地点的远近来区分上下层。
3、中间的轮转视图在滑行的时候发现卡片大小不等同,中间的最大,越靠近边框越小。
4、中间的滚动视图在滑行的时候发现滑动的距离和卡片移动的离开并不是成正比,而是听从持续变更的加速度移动的。
5、中间的滚动视图滑到左右侧缘时视图透明度改变。
6、循环滚动方案的实现
7、上下滑动表格时,中间的轮转视图要接着一块滑动,上滑时向左移动,下滑时向右移动。
8、左右晃入手机时,中间的滚动视图要接着一块儿滑动,向左晃动时卡片向左移动,向右晃动时卡片向右移动。
9、需要保证刚才提到的3种控制格局互不困扰。

大题目大体就是这个,当然还有众多小题目,就不一一列出来了。

2.1.3 实验结论:

如上尝试代码中,有这么一行代码:

return [string1 compare:string2 options:nil range:string1Range locale:currentLocale];

按照运行结果,可知如下结论:

  • 即使在- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale;中将(NSStringCompareOptions)枚举类型的参数设置为nil,也可以运作。但一般不这么做,那里只是为着考察不点名该枚举参数时候系统的默认设置,并与本文接下去指定该枚举参数的排序结果比较。
  • 可以发现:
    • 默认可一字符的全角字符看做半角字符。不区分同一个字符(如日文的片假字)的半角与全角状态。相同元素,维持原序。
    • 默认区分字母大小写,同一个字符小写在前,大写在后。
    • 字母并非按unicode码的尺寸升序排列。例如,全角a的unicode为FF41,半角a的unicode为0061,半角A的unicode为0041,半角b的unicode为0062,但排序结果是
      全角a = 半角a < 半角A < 半角b
    • 默认不识别含有数字字符的数值大小,0030虽然数学意义比2大,可是,仅从字符串的角度看,第一个字符0比2小,所以d0030排在d2前边。
2.2.1 NSNumericSearch

法定解释:Added in 10.2; Numbers within strings are compared using
numeric value, that is, Foo2.txt < Foo7.txt < Foo25.txt; only
applies to compare methods, not find

  • 假定,将上例中的部分代码修改为

void handleSortingForStrArray(void){
    NSArray *stringsArray = [NSArray arrayWithObjects:
                             @"string b",
                             @"string A",
                             @"string a",
                             @"string \uFF41",
                             @"string a",
                             @"string A",
                             @"string c",
                             @"string d0030",
                             @"string d2",
                             @"アいろはアイウエイウエ",
                             @"アいろはアイウエイウエ",
                             @"アいろはアイウエイウエ",nil];
    NSStringCompareOptions comparisonOptions = NSNumericSearch;
    NSLocale *currentLocale = [NSLocale currentLocale];
    NSComparator finderSortBlock = ^(id string1,id string2) {

        NSRange string1Range =NSMakeRange(0, [string1 length]);
        return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
    };

    NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
    NSLog(@"finderSortArray: %@", finderSortArray);
}
  • 运转结果

image.png

  • 结论
    NSStringCompareOptions指定为NSNumericSearch,当字符串中含有数字时,从数值大小的角度按升序排序。

1. 率先种:数组的字符串元素里面是主旨数据类型


2.2.5 NSForcedOrderingSearch

官方解释:If specified, comparisons are forced to return either
NSOrderedAscending or NSOrderedDescending if the strings are
equivalent but not strictly equal, for stability when sorting (e.g.
“aaa” > “AAA” with NSCaseInsensitiveSearch specified)

  • 如若,将上例中的部分代码修改为

NSStringCompareOptions comparisonOptions = NSForcedOrderingSearch;
  • 运行结果

image.png

  • 结论
    • 不存在字符等不同效相不对等的定义了,只要unicode不雷同的字符,必须区分,必须再次来到一个谁大何人小的结果(NSOrderedAscending
      or NSOrderedDescending)。
    • 从英文表达也能够见见,NSForcedOrderingSearch
      的优先级最高,即只要你而且指定了其他有可能效果争执的枚举类型,也以NSForcedOrderingSearch
      的功用为准。
2.2.6 综合使用
  • 一个相比较多的采纳示范是,区分字母大小写,区分数值大小,区分半角全角,并强制性指定区分unicode不雷同的字符。综合这一个规则,写起来就是:

NSStringCompareOptions comparisonOptions = NSNumericSearch|NSWidthInsensitiveSearch|NSForcedOrderingSearch;
  • 运作结果

image.png

2.2.3 NSLiteralSearch

法定表达:Exact character-by-character equivalence

  • 万一,将上例中的部分代码修改为

NSStringCompareOptions comparisonOptions = NSLiteralSearch;
  • 运行结果

image.png

  • 结论
    • 区分
      同一个字符(如日文的片假字)的半角与全角状态,同一片假字的全角状态小于半角状态。
    • 其它规则,继续按系统默认排序规则排序,包括默认区分
      字母大小写,以及其他默认排序规则。
    • 遵守合法英文表明,那一个规则是指分别每个字符的一致状态。只要unicode不同的字符,就不认账他们“等效”,固然他们的言语上的意思相同。

  • 题外话
    • 之所以,有的文献说NSLiteralSearch
      是分别轻重缓急写是误导,系统本就默认区分
      字母大小写,这个人觉着苹果公司提供那个意义来画蛇添足干嘛?而且能够看看官方英文表明,也不是以此意思。唯有指定不区分
      字母大小写的NSCaseInsensitiveSearch,要么不写,即默认区分

5. 附录:本实验中开创工程表明


任何能在总结机上举办的花色名为程序,其中,有图形化用户界面的顺序名为应用
,没有图形界面的先后可以是看护进程
,还有一种名叫命令行工具。本文这里关注的是算法和数量结果,不珍视图形界面,所以新建一个命令行工具即可。创制方法:新建一个macOS工程,接纳Command
Line Tool类型,点击下一步配置工程新闻即可。

创制一个命令行工具

工程成立成功

1.2.1 NSComparator
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
2.1.2 运行结果:

image.png

1.1.3 实验结论
  • 依据数组元素的数值大小再次来到升序数组

1.2 NSComparator与NSComparisonResult

上边的代码中用到了NSComparator与NSComparisonResult,在本文的“前边的话”中一度介绍过,这里再一次列一下定义。

4. 花样玩法:例题


在OC的高级用法中,日常索要查阅系统类或者某个自定义类中的私有属性以及个体成员变量,并透过KVC的主意强制修改那些私家成员变量的值,以代替系统或者自定义类中的默认设置。所以,假若您懒得创造一些假数据的数组,可以想到利用运行时的艺术拿到成员变量的数组,并拓展排序操作磨炼。

题1. 请取出NSString类的成套公有 属性
并存放到一个数组,并采取NSArraysortedArrayUsingComparator的点子给这些数组举行升序排序操作。要求:排序过程中需要区分字符全角半角状态,其余可按系统默认条件。

  • 参考代码:
    main.m

void handlePrintingOfProperties(void){
    unsigned int count;// 记录属性个数
    objc_property_t *properties = class_copyPropertyList([NSString class], &count);
    // 生成一个属性名称组成的数组
    NSMutableArray *propertyNameArray = [NSMutableArray array];
    for (int i = 0; i < count; i++) {
        // An opaque type that represents an Objective-C declared property.
        // objc_property_t 属性类型
        objc_property_t property = properties[i];
        // 获取属性的名称 C语言字符串
        const char *cName = property_getName(property);
        // 转换为Objective C 字符串
        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
        [propertyNameArray addObject:name];
    }
    NSLog(@"排序前的属性列表 = %@",propertyNameArray);

    NSComparator cmptr = ^(NSString *obj1, NSString *obj2){
        return [obj1 compare:obj2 options:NSLiteralSearch];
    };
    NSArray *afterSort = [propertyNameArray sortedArrayUsingComparator:cmptr];
    NSLog(@"排序后的属性列表 = %@",afterSort);

    //C语言中,用完copy,create的东西之后,最好释放
    free(properties);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"handlePrintingOfProperties()**********************");
        handlePrintingOfProperties();
    }
    return 0;
}
  • 运作结果

image.png

题2. 请取出NSURL类中概括私有 在内的全部
成员变量,并存放到一个数组,并动用NSArraysortedArrayUsingComparator的点子给这些数组举办升序排序操作。要求:排序过程中需要区分字符全角半角状态,其余可按系统默认条件。

  • 参照代码:

void handlePrintingOfIvars(void){
    unsigned int count;// 记录属性个数
    Ivar *properties = class_copyIvarList([NSURL class], &count);
    // 生成一个属性名称组成的数组
    NSMutableArray *propertyNameArray = [NSMutableArray array];
    for (int i = 0; i < count; i++) {
        // An opaque type that represents an Objective-C declared property.
        // objc_property_t 属性类型
        Ivar property = properties[i];
        // 获取属性的名称 C语言字符串
        const char *cName = ivar_getName(property);
        // 转换为Objective C 字符串
        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
        [propertyNameArray addObject:name];
    }
    NSLog(@"排序前的成员变量列表 = %@",propertyNameArray);

    NSComparator cmptr = ^(NSString *obj1, NSString *obj2){
        return [obj1 compare:obj2 options:NSLiteralSearch];
    };
    NSArray *afterSort = [propertyNameArray sortedArrayUsingComparator:cmptr];
    NSLog(@"排序后的成员变量列表 = %@",afterSort);

    //C语言中,用完copy,create的东西之后,最好释放
    free(properties);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"handlePrintingOfIvars()**********************");
        handlePrintingOfIvars();
    }
    return 0;
}
  • 运行结果

image.png

2.2.4 NSWidthInsensitiveSearch

合法表达:If specified, ignores width differences (‘a’ == UFF41)

  • 倘若,将上例中的部分代码修改为

NSStringCompareOptions comparisonOptions = NSWidthInsensitiveSearch;
  • 运行结果

image.png

  • 结论
    • 不区分
      同一个字符(如日文的片假字)的半角与全角状态,同一片假字的全角状态分外半角状态。
    • 其余规则,继续按系统默认排序规则排序,包括默认区分
      字母大小写,以及其他默认排序规则。
    • 再就是指定多个时,NSWidthInsensitiveSearch
      NSLiteralSearch 的事先级高,综合起来的结果是不区分
      半角全角。
    • 法定英文表达中的UFF41是指全角a'a'
      是指半角a,假若指定NSWidthInsensitiveSearch,则不区分字符的全角半角,即便你还要指定了NSLiteralSearch

即,当有如下代码

NSStringCompareOptions comparisonOptions = NSWidthInsensitiveSearch | NSLiteralSearch;

其效率相当于尚未NSLiteralSearch的代码

NSStringCompareOptions comparisonOptions = NSWidthInsensitiveSearch;
1.1.2 运行结果

image.png

2.2 NSStringCompareOptions

NSStringCompareOptions是一个枚举类型,并非一个类。打开NSStringCompareOptions的定义,可查阅如下

typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) {
    NSCaseInsensitiveSearch = 1,
    NSLiteralSearch = 2,        /* Exact character-by-character equivalence */
    NSBackwardsSearch = 4,      /* Search from end of source string */
    NSAnchoredSearch = 8,       /* Search is limited to start (or end, if NSBackwardsSearch) of source string */
    NSNumericSearch = 64,       /* Added in 10.2; Numbers within strings are compared using numeric value, that is, Foo2.txt < Foo7.txt < Foo25.txt; only applies to compare methods, not find */
    NSDiacriticInsensitiveSearch API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 128, /* If specified, ignores diacritics (o-umlaut == o) */
    NSWidthInsensitiveSearch API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 256, /* If specified, ignores width differences ('a' == UFF41) */
    NSForcedOrderingSearch API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 512, /* If specified, comparisons are forced to return either NSOrderedAscending or NSOrderedDescending if the strings are equivalent but not strictly equal, for stability when sorting (e.g. "aaa" > "AAA" with NSCaseInsensitiveSearch specified) */
    NSRegularExpressionSearch API_AVAILABLE(macos(10.7), ios(3.2), watchos(2.0), tvos(9.0)) = 1024    /* Applies to rangeOfString:..., stringByReplacingOccurrencesOfString:..., and replaceOccurrencesOfString:... methods only; the search string is treated as an ICU-compatible regular expression; if set, no other options can apply except NSCaseInsensitiveSearch and NSAnchoredSearch */
};

2.1 示例:字符串数组排序

3. 数组里面是类的靶子


需要:假诺大家依照后台再次来到的JSON字典数组用MJExtension转换成模型数组,现在大家需要依照ID或者Age对模型数组举行排序。

  • Pesson.m

#import <Foundation/Foundation.h>  

@interface Person : NSObject  
@property (nonatomic,copy) NSString *ID;  
@property (nonatomic,copy) NSString *name;  
@property (nonatomic,assign) int age;  
@end  
  • 依据int类型的性能对模型数组举办排序

NSArray *sortArrayByAgeInt = [self.dataArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {  

    Person *pModel1 = obj1;  
    Person *pModel2 = obj2;  

    if (pModel1.age > pModel2.age) { 
        return NSOrderedDescending;//降序  
    }else if (pModel1.name < pModel2.name){  
        return NSOrderedAscending;//升序  
    }else {  
        return NSOrderedSame;//相等  
    }  

}];
  • 基于str类型的性质对模型数组举行排序

NSArray *sortArrayByIDStr = [self.dataArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {  

    Person *pModel1 = obj1;  
    Person *pModel2 = obj2;  

    if ([pModel1.ID intValue]> [pModel2.ID intValue]) { 
        return NSOrderedDescending;//降序  
    }else if (pModel1.name < pModel2.name){  
        return NSOrderedAscending;//升序  
    }else {  
        return NSOrderedSame;//相等  
    }  

}];
2.1.4 知识进行:

半角与全角字符

  • 全角占三个字节,半角占一个字节。平常咱们碰着的英文字母、数字键、符号键这种ASCII码系统里面的字符大多数状态下是半角的。

  • 境内汉字输入法输入的方块字为全角,字母数字为半角,可是标点则默认为全角,可切换为半角(可以因此输入法工具条上的呼应按钮来切换标点符号的全角半角状态)。

  • 日文里面的有汉字,也有片假字。这多少个片假字有两套编码,同一个片假字分别有半角和全角二种编码。例如:看起来像相同的片假字组成的语句,全角状态字符起先的为アいろはアイウエイウエ,半角状态字符开端的为アいろはアイウエイウエ。能够观望,显明同一个片假字的全角状态
    半角状态 “胖”一圈。

  • 英文字母其实也有全角字母,例如小写的a,其半角形式的unicode码为0061,其全角情势的unicode码为FF41。可查阅Unicode®字符百科官网。

1.2.2 NSComparisonResult
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
1.1.1 实验代码
  • main.m

void handleSortingForIntStrArray(void){
    NSArray *originalArray = @[@"00",@"0",@"00",@"01",@"10",@"21",@"12",@"11",@"22"];
    //block比较方法,数组中可以是NSInteger,NSString(需要转换)
    NSComparator finderSort = ^(id string1,id string2){
        if ([string1 integerValue] > [string2 integerValue]) {
            return (NSComparisonResult)NSOrderedDescending;
        }else if ([string1 integerValue] < [string2 integerValue]){
            return (NSComparisonResult)NSOrderedAscending;
        }else{
            return (NSComparisonResult)NSOrderedSame;
        }
    };
    //数组排序:
    NSArray *resultArray = [originalArray sortedArrayUsingComparator:finderSort];
    NSLog(@"第一种排序结果:%@",resultArray);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Results of handleSortingForIntArray()**********************");
        handleSortingForIntStrArray();
    }
    return 0;
}

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图