NSMutableArray简单细说(六)—— 数组的过滤和排序

版本记录

版本号 时间
V1.0 2017.08.26

前言

NSArray是数组的不变数组类,不边数组在初始化的时候元素就是不变的,不能更改任何一个元素,实际上我们用的较多的是可变数组,因为很多时候我们都需要对数组元素进行增删改查,其中增删改也只有可变数组可以做,也就是说可变数组相对来说更加灵活,这几篇我们就说一下可变数组的这个类及其相关知识,还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以看我写的上面几篇。
1. NSMutableArray简单细说(一)—— 整体了解
2. NSMutableArray简单细说(二)—— 创建和初始化
3. NSMutableArray简单细说(三)—— 数组元素的增加
4. NSMutableArray简单细说(四)—— 数组元素的删除
5. NSMutableArray简单细说(五)—— 更换数组中的对象

一、- (void)filterUsingPredicate:(NSPredicate *)predicate;

该方法的作用是:根据数组的内容评估给定的谓词,只留下匹配的对象。

下面看示例代码

- (void)demoFilterUsingPredicate
{
    NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@5,@6,@7, nil];
    NSArray *array2 = [NSArray arrayWithObjects:@4,@5, nil];
    
    // 表示筛选array1在array2中的元素!YES!其中SELF指向filteredArrayUsingPredicate的调用者。
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF in %@",array2];
    NSArray *resultArr = [array1 filteredArrayUsingPredicate:predicate];
    NSLog(@"resultArr = %@", resultArr);
}

下面看输出结果

2017-08-26 23:39:08.135 JJOC[18027:483439] resultArr = (
    5
)

结论:数组元素的过滤。


二、- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;

该方法的作用就是:交换数组中两个索引处的对象。

下面看示例代码

- (void)demoExchangeObjectAtIndex
{
    NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
    [arrM exchangeObjectAtIndex:0 withObjectAtIndex:3];
    NSLog(@"arrM = %@", arrM);
}

下面看输出结果

2017-08-26 23:42:17.248 JJOC[18162:486420] arrM = (
    Four,
    two,
    three,
    one,
    Five
)

结论:交换两个索引处的对象。


三、- (void)sortUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors;

该方法的作用就是:利用给定的排序描述符,对对象进行排序。

看一下参数

  • sortDescriptors:包含用于对接收数组的内容进行排序的NSSortDescriptor对象的数组。

看示例代码

- (void)demoSortDescription
{
    NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"2030",@"year", @"1",@"month",nil];
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"2010",@"year", @"2",@"month", nil];
    NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"2050",@"year", @"3",@"month" ,nil];
    NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:@"2014",@"year",  @"4",@"month",nil];
    NSDictionary *dic5 = [NSDictionary dictionaryWithObjectsAndKeys:@"2050",@"year",  @"4",@"month",nil];
    
    NSMutableArray *arrM = [NSMutableArray arrayWithObjects:dic1, dic2, dic3, dic4, dic5, nil];
    
    NSSortDescriptor *descripor = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:YES];
    NSSortDescriptor *descripor2 = [NSSortDescriptor sortDescriptorWithKey:@"month" ascending:YES];
    [arrM sortUsingDescriptors:[NSArray arrayWithObjects:descripor, descripor2, nil]];
    
    NSLog(@"resultArr = %@", arrM);
}

看输出结果

2017-08-26 23:51:46.047 JJOC[18488:495473] resultArr = (
        {
        month = 2;
        year = 2010;
    },
        {
        month = 4;
        year = 2014;
    },
        {
        month = 1;
        year = 2030;
    },
        {
        month = 3;
        year = 2050;
    },
        {
        month = 4;
        year = 2050;
    }
)

结论:利用排序描述符进行排序。


四、- (void)sortUsingComparator:(NSComparator)cmptr;

该方法的作用是:使用给定的NSComparator块指定的比较方法对接收器进行升序排序。

下面看示例代码

- (void)demoSortUsingComparator
{
    NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
    [arrM sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj2 compare:obj1];
    }];
    NSLog(@"arrM = %@", arrM);
}

看输出结果

2017-08-27 00:01:05.027 JJOC[18709:503123] arrM = (
    two,
    three,
    one,
    Four,
    Five
)

结论:比较器进行数组元素的比较。


五、- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr;

该方法的作用就是:使用指定的选项和由给定的NSComparator块指定的比较方法按升序对接收方进行排序。

下面看一下参数:

  • opts:指定排序选项的位掩码(是否应同时执行,是否应稳定执行)。
  • cmptr:比较器的块代码。

下面看示例代码

- (void)demoSortWithOptions
{
    NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
    [arrM sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj2 compare:obj1];
    }];
    NSLog(@"arrM = %@", arrM);
}

看输出结果

2017-08-27 00:06:11.983 JJOC[18900:508769] arrM = (
    two,
    three,
    one,
    Four,
    Five
)

结论:带有选项比较器的排序。


六、- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void *))compare context:(void *)context;

该方法的作用是:按照比较功能比较定义的升序对接收器进行排序。

看一下参数:

  • compare:用于比较两个元素的比较函数。函数的参数是要比较的两个对象和上下文参数,上下文。 如果第一个元素小于第二个元素,则该函数应返回NSOrderedAscending,如果第一个元素大于第二个元素,则返回NSOrderedDescending,如果元素相等则返回NSOrderedSame
  • context:传递比比较函数的上下文。

还要注意:

  • 该方法允许比较基于一些外部参数,例如字符排序是区分大小写还是不区分大小写。

结论:使用函数进行排序。


七、- (void)sortUsingSelector:(SEL)comparator;

该方法的作用是:按照由给定选择器指定的比较方法确定的升序排序接收器。

这里看一下参数:

  • comparator:一个选择器,指定比较方法来比较数组中的元素。比较器消息被发送到数组中的每个对象,并且在数组中具有另一个对象。 如果数组小于参数,则比较器方法应返回NSOrderedAscending,如果数组大于参数,NSOrderedDescending,如果它们相等则返回NSOrderedSame

下面看示例代码

- (void)demoSortedArrayUsingSelector
{
    NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"six", @"two", @"three", @"four", @"five", nil];
    [arrM sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"arrM = %@", arrM);
}

下面看输出结果

2017-08-27 00:32:38.649 JJOC[20166:534702] arrM = (
    six,
    two,
    three,
    four,
    five
)

结论:采用指定方法直接排序。

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容