前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Objective-C 数组筛选

Objective-C 数组筛选

作者头像
赵哥窟
发布2018-09-13 11:50:31
1.4K0
发布2018-09-13 11:50:31
举报
文章被收录于专栏:日常技术分享日常技术分享

想项目有可能会遇到按照一定条件对某一个数组进行筛选。 直接遍历数组,取符合条件的对象放到一个新数组效率可能不高。

下面介绍一个更简便的方法来实现

简介

NSPredicate类主要用来指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配。谓词是指在计算机中表示计算真假值的函数。原理和用法都类似于SQL查询中的where,作用相当于数据库的过滤取。主要用于从集合中分拣出符合条件的对象或者数据模型,也可以用于字符串的正则匹配. 一般的, NSPredicate的筛选过滤的条件可以是, 逻辑运算符号(> , < , =),范围运算符(IN,BETWEEN),字符的包含/匹配/模糊搜索(BEGINSWITH,ENDSWITH,CONTAINS,LIKE), 正则表达式(MATCHES)等.

NSPredicate用法 1.创建NSPredicate NSPredicate *predicate = [NSPredicate predicateWithFormat:@"过滤条件"]; 2.判断指定的对象是否满足NSPredicate创建的过滤条件 [predicate evaluateWithObject:model]; 3.将array通过创建的predicate进行过滤,并返回符合条件的数据 NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];

具体实现,首先我们定义一个Peron类

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;

-(void)printPerson ;
代码语言:javascript
复制
#import "Person.h"

@interface Person()

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
    self = [super init];
    if (self) {
        self.name = name;
        self.age = age;
    }
    return self;
}

-(void)printPerson {
    NSLog(@"Name is %@ ageis %zd ",_name, _age);
}

在定义个NSMutableArray的Category NSMutableArray+Extended

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface NSMutableArray (Extended)

/**
 数组筛选属性为Int类型的对象

 @param condition 筛选条件
 @param value 属性对应的值
 @return 筛选后的数组
 */
-(NSMutableArray*)getArrayWithInt:(NSString*)condition value:(NSInteger)value;


/**
 数组筛选属性为NSString类型的对象

 @param key 对象对应的属性字段
 @param value 对象对应的值
 @return 筛选后的数组
 */
-(NSMutableArray*)getArrayWithString:(NSString*)key value:(NSString*)value;

@end
代码语言:javascript
复制
#import "NSMutableArray+Extended.h"

@implementation NSMutableArray (Extended)

-(NSMutableArray*)getArrayWithInt:(NSString*)condition value:(NSInteger)value
{
    NSPredicate *inputPredicate=[NSPredicate predicateWithFormat:condition,value];
    NSMutableArray *newMutableArray = [NSMutableArray arrayWithArray:[self filteredArrayUsingPredicate:inputPredicate]];
    return newMutableArray;
}

-(NSMutableArray*)getArrayWithString:(NSString*)key value:(NSString*)value
{
    NSPredicate *inputPredicate=[NSPredicate predicateWithFormat:@"%K like[cd] %@",key, [NSString stringWithFormat:@"*%@*",value]];
    NSMutableArray *newMutableArray = [NSMutableArray arrayWithArray:[self filteredArrayUsingPredicate:inputPredicate]];
    return newMutableArray;
}

@end

下面调用

代码语言:javascript
复制
Person *p1 = [[Person alloc]initWithName:@"aa" age:18];
Person *p2 = [[Person alloc]initWithName:@"bb" age:18];
Person *p3 = [[Person alloc]initWithName:@"cc" age:18];
Person *p4 = [[Person alloc]initWithName:@"dd" age:22];
Person *p5 = [[Person alloc]initWithName:@"ee" age:15];
    
NSMutableArray *personArr = [NSMutableArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
// 取出数组中age = 18的对象
[[personArr getArrayWithInt:@"age=%d" value:18] makeObjectsPerformSelector:@selector(printPerson)];
// 取出数组中name = @"aa"的对象
[[personArr getArrayWithString:@"name" value:@"aa"] makeObjectsPerformSelector:@selector(printPerson)];
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.05.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档