谓词的经典用法——数组专用过滤器
应用环境:
当一个数组容器中有很多相同对象时,如果想按照某种要求对数组容器中的满足条件的对象进行筛选时,有两种方法
一 就是最笨的方法遍历数组 用if条件语句进行筛选
二 可以用最简洁的方法 就是利用谓词进行筛选过滤
谓词的使用方法:
1> 先以某种筛选条件进行初始化创建一个NSPredicate类的对象 即
NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"self.age<30"];
2> 再使用filteredArrayUsingPredicate:方法为存放对象的数组绑定筛选条件并将满足条件的对象(可以说是对象地址)存放到一个新的数组中,如下所示:NSArray *filterArray1 = [personsfilteredArrayUsingPredicate:predicate];
3> 筛选语句有以下几种:
(1)> ,<,= 即@"对象属性名> 某个值"
(2)&& 用于连接多个必须同时满足的条件 条件1&&条件2 表示且 例如:@"name=='小白'&&age>40"
(3)|| 用于连接多个或关系的条件语句 表示满足其中一个条件即可 例如:@"name=='小白'||age>40"
(4)IN 包含的意思后面跟花括号,花括号内的值用逗号隔开。表示指定的属性值是{}内中的一个。如下所示:@"self.name IN {'小黑','Cose'} || self.age IN {20,50}"
(5)BEGINSWITH 以什么开头,即以一个或多个或指定格式的字符串开头。例如:@"name BEGINSWITH 'a' "
(6)ENDSWITH 以什么结尾
(7)CONTAINS 是否包含指定的一个或多个字符以及指定格式的字符串。例如:@"self.name CONTAINS 'se' "
(8)LIKE: 模糊查询 用到的格式符如下:
* 星号表示匹配0个或多个字符
? 问号表示一个字符
例如:@"self.name LIKE '?a*' "
新建工程代码如下:
Person.h
<span style="font-size:18px;">//
// Person.h
// 谓词的具体使用
//
// Created by apple on 15/9/21.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age; // UInteger表示无符号数,全为正整数
+(id)personWithName:(NSString *)name andAge:(NSUInteger) age;
@end
</span>
Person.m
<span style="font-size:18px;">//
// Person.m
// 谓词的具体使用
//
// Created by apple on 15/9/21.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import "Person.h"
@implementation Person
+(id)personWithName:(NSString *)name andAge:(NSUInteger ) age
{
Person *person = [[Person alloc] init];
person.name = name;
person.age = age;
return [person autorelease];
}
-(void) dealloc
{
[_name release];
[super dealloc];
}
-(NSString *) description
{
NSString *s = [NSString stringWithFormat:@"name= %@, age= %ld",_name,_age];
return s;
}
@end
</span>
main.m
<span style="font-size:18px;">//
// main.m
// 谓词的具体使用
//
// Created by apple on 15/9/21.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *persons = [NSArray arrayWithObjects:
[Person personWithName:@"mac" andAge:20],
[Person personWithName:@"hate" andAge:25],
[Person personWithName:@"999ere" andAge:30],
[Person personWithName:@"aruse" andAge:28],
[Person personWithName:@"Erse" andAge:30],
[Person personWithName:@"Ahon" andAge:29],
[Person personWithName:@"Cose" andAge:30],
[Person personWithName:@"小白" andAge:20],
[Person personWithName:@"Iog" andAge:30],
[Person personWithName:@"小白" andAge:50],
[Person personWithName:@"小黑" andAge:30]
, nil];
// 定义谓词对象,谓词对象中包含了过滤条件
// self: 表示的是数组存放的对象 当条件不确定时用格式符指定变量
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age<%d",30];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age<30"];
//1 使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
NSArray *filterArray1 = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray1 (age<30)= %@\n",filterArray1);
// 2 使用&&符号
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"name=='小白'&&age>40"];
NSArray *filterArray2 = [persons filteredArrayUsingPredicate:predicate2];
NSLog(@"filterArray2 (name='小白'&&age>40)= %@\n",filterArray2);
// 3. IN(包含的意思) 后面跟花括号
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"self.name IN {'小黑','Cose'} || self.age IN {20,50}"];
NSArray *filterArray3 = [persons filteredArrayUsingPredicate:predicate3];
NSLog(@"filterArray3 (self.name IN {'小黑','Cose'} || self.age IN {20,50})= %@\n",filterArray3);
// 4 BEGINSWITH 判断字符串以指定的什么开头的
NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a' "];
NSArray *filterArray4 = [persons filteredArrayUsingPredicate:predicate4];
NSLog(@"filterArray4 (name BEGINSWITH 'a' )= %@\n",filterArray4);
// 5 ENDSWITH 判断字符串是否以指定的字符或字符串结尾的
NSPredicate *predicate5 = [NSPredicate predicateWithFormat:@"name ENDSWITH 'e' "];
NSArray *filterArray5 = [persons filteredArrayUsingPredicate:predicate5];
NSLog(@"filterArray5 (name ENDSWITH 'e' )= %@\n",filterArray5);
// 6 CONTAINS 是否包含指定字符或字符串
NSPredicate *predicate6 = [NSPredicate predicateWithFormat:@"self.name CONTAINS 'se' "];
NSArray *filterArray6 = [persons filteredArrayUsingPredicate:predicate6];
NSLog(@"filterArray6 (name CONTAINS 'a' )= %@\n",filterArray6);
// 7 like 模糊查询
/*
* 星号匹配代表0个或多个字符
? 问号代表一个字符
*/
NSPredicate *predicate7 = [NSPredicate predicateWithFormat:@"self.name LIKE '?a*' "];
NSArray *filterArray7 = [persons filteredArrayUsingPredicate:predicate7];
NSLog(@"filterArray7 (self.name LIKE '?a*' )= %@\n",filterArray7);
}
return 0;
}
</span>
运行结果如下:
上一篇: Flask RESTful API
下一篇: git一些进阶的操作和坑