iOS开发之谓词Predicate和对象数组的排序
我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词。
因为内容比较简单,所以直接上代码展示:
NSMutableArray *people_arr = [NSMutableArray new]; NSMutableArray *filter_arr = [NSMutableArray new]; for (int i = 0; i < 10; i++) { People *people = [People new]; people.name = @[@"jack",@"jester",@"jester",@"joce",@"joke",@"java",@"amy",@"jason",@"mike",@"jwt"][i]; people.age = 15+i; people.gender = i%2? @"男":@"女"; people.address = @[@"郑州",@"上海",@"济南",@"北京",@"杭州"][arc4random()%5]; for (int j = 0; j < 3; j ++) { Employee *employee = [Employee new]; employee.employeeId = i+arc4random()%3; employee.department = @[@"研发部",@"人事部",@"财务部",@"运营部"][arc4random()%4]; [people.employees addObject:employee]; } [people_arr addObject:people]; arc4random()%3 == 0 ? [filter_arr addObject:people] : NULL; } /* // 利用 NSSortDescriptor 对对象数组,按照某一属性或某些属性的升序降序排列 NSSortDescriptor *des1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSSortDescriptor *des2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO]; [people_arr sortUsingDescriptors:@[des1, des2]]; // 利用 block回调 对对象数组,按照某一属性或某些属性的升序降序排列 [people_arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { People *p1 = (People *)obj1; People *p2 = (People *)obj2; return [p1.name compare:p2.name]; }]; // 利用 自定义比较方法 对对象数组,按照某一属性或某些属性的升序降序排列 [people_arr sortUsingSelector:@selector(comparePeople:)]; NSLog(@"sorted:%@", people_arr); */ //------------------------ Predicate谓词的简单使用 // self 表示数组元素/字符串本身 // 比较运算符 =/==(等于)、>=/=>(大于等于)、<=/=<(小于等于)、>(大于)、<(小于)、!=/<>(不等于) //NSPredicate *pre = [NSPredicate predicateWithFormat:@"self = %@",[people_arr lastObject]];//比较数组元素相等 //NSPredicate *pre = [NSPredicate predicateWithFormat:@"address = %@",[(People *)[people_arr lastObject] address]];//比较数组元素中某属性相等 ////NSPredicate *pre = [NSPredicate predicateWithFormat:@"age in {18,21}"];//比较数组元素中某属性值在这些值中 //NSPredicate *pre = [NSPredicate predicateWithFormat:@"age between {18,21}"];//比较数组元素中某属性值大于等于左边的值,小于等于右边的值 // 逻辑运算符 and/&&(与)、or/||(或)、not/!(非) //NSPredicate *pre = [NSPredicate predicateWithFormat:@"address = %@ && age between {19,22}",[(People *)[people_arr lastObject] address]]; // 字符串比较运算符 beginswith(以*开头)、endswith(以*结尾)、contains(包含)、like(匹配)、matches(正则) // [c]不区分大小写 [d]不区分发音符号即没有重音符号 [cd]既 又 //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name beginswith[cd] 'ja'"]; //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name matches '^[a-zA-Z]{4}$'"]; //集合运算符 some/any:集合中任意一个元素满足条件、all:集合中所有元素都满足条件、none:集合中没有元素满足条件、in:集合中元素在另一个集合中 //NSPredicate *pre = [NSPredicate predicateWithFormat:@"all employees.employeeId in {7,8,9}"]; //NSPredicate *pre = [NSPredicate predicateWithFormat:@"self in %@",filter_arr]; // $K:用于动态传入属性名、%@:用于动态设置属性值(字符串、数字、日期对象)、$(value):可以动态改变 //NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K > $age",@"age"]; //pre = [pre predicateWithSubstitutionVariables:@{@"age":@21}]; // NSCompoundPredicate 相当于多个NSPredicate的组合 //NSCompoundPredicate *compPre = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"age > 19"],[NSPredicate predicateWithFormat:@"age < 21"]]]; // 暂时没找到用法 //NSComparisonPredicate *compPre = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"name"] rightExpression:[NSExpression expressionForVariable:@"ja"] modifier:NSAnyPredicateModifier type:NSBeginsWithPredicateOperatorType options:NSNormalizedPredicateOption]; //[people_arr filterUsingPredicate:compPre]; NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { return [evaluatedObject age] > 21; }]; // NSPredicate 不影响原数组,返回数组即为过滤结果 //NSArray *temp_arr = [people_arr filteredArrayUsingPredicate:pre]; //NSLog(@"%@", temp_arr); // NSPredicate 原数组数据即为过滤结果 [people_arr filterUsingPredicate:pre]; NSLog(@"%@", people_arr);
上面涉及到的谓词的简单使用,下面顺便讲三个对象数组排序的方法:
第一种方式: 利用 NSSortDescriptor 对对象数组,按照某一属性或某些属性的升序降序排列
NSSortDescriptor *des1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *des2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
[people_arr sortUsingDescriptors:@[des1, des2]];
这种方式,利用多个NSSortDescriptor对象的组合使用,进行排序,而且组合顺序不同,得到的结果应该也会有所差别。这里没有进行测试,想探索的可以自己去试一试
第二种方式:利用 block回调 对对象数组,按照某一属性或某些属性的升序降序排列
[people_arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
People *p1 = (People *)obj1;
People *p2 = (People *)obj2;
return [p1.name compare:p2.name];
}];
第三种方式:利用自定义比较方法 对对象数组,按照某一属性或某些属性的升序降序排列
[people_arr sortUsingSelector:@selector(comparePeople:)];
源码下载:https://github.com/hbblzjy/iOCNSPredicateDemo
iOS开发之谓词Predicate和对象数组的排序的更多相关文章
- PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))
PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- 利用Comparable接口实现对对象数组的排序
Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该 ...
- C#基础:通过委托给任何对象数组进行排序
在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法 for (int ...
- iOS开发系列--Objective-C之类和对象
概述 前面已经简单介绍过ObjC的基础知识,让大家对ObjC有个大致的印象,今天将重点解释ObjC面向对象的特性.ObjC相对于C语言多了面向对象特性,但是ObjC又没有其他面向对象语言那么多语法特性 ...
- ios开发 oc 的类方法与对象方法
--------开始前先申明一下:小编为了让大家看出效果,在编码中命名方式会又些不规范. 首先我们先来了解一下什么是类方法与对象方法. 对象方法: 对象是由“-”开头.比如:-(void)Runner ...
- IOS开发学习笔记010-面向对象的三大特性
面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...
- js通用对象数组冒牌排序
数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
随机推荐
- Vincent
歌手Don McClean的Starry Starry Night,也有很多人叫这首歌为<Vincent> 编前:金色的向日葵.燃烧般的丝柏.风吹过的麦田.旋涡状的星体……,一幅幅狂嚣般的 ...
- 12 Spring框架 SpringDAO的事务管理
上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...
- List和Set区别
1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...
- python之路 堡垒机paramiko
paramiko 1.安装 pip3 install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建S ...
- cdoj1325卿学姐与基本法
地址:http://acm.uestc.edu.cn/#/problem/show/1325 题目: 卿学姐与基本法 Time Limit: 2000/1000MS (Java/Others) ...
- Keepalived + Mysql 主主复制高可用
环境 系统:Centos 7.4 x64 服务:Mariadb 5.5 .Keepalived 1.3.5.6 结构 主1:192.168.1.108 主2:192.168.1.109 VIP:19 ...
- shell 中的 eval 及 crontab 命令
eval eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置 ...
- 20145219 《Java程序设计》第07周学习总结
20145219 <Java程序设计>第07周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为椭圆形且速度不一,本身 ...
- Terms of Company
CMD系统:中国机车远程监视与诊断系统,由车载子系统.车地数据传输子系统和CMD地面综合应用子系统三部分组成. LKJ:列车运行监控装置,机车运行过程中与行车安全相关的信息,如司机号.车次.公里标.速 ...
- Kotlin 取 MAC 地址
package com.example.ybs.myapplication import android.annotation.SuppressLint import android.net.wifi ...