欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

谓词的经典用法——数组专用过滤器

程序员文章站 2024-03-22 09:45:04
...

应用环境:

当一个数组容器中有很多相同对象时,如果想按照某种要求对数组容器中的满足条件的对象进行筛选时,有两种方法

一 就是最笨的方法遍历数组 用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>
运行结果如下:

谓词的经典用法——数组专用过滤器