携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第34天,点击查看活动概略
前言
- 运用
方针操作符
从数组查找特定的元素:kunnan.blog.csdn.net/article/det…
// @distinctUnionOfObjects:回来指定特色去重后的值的数组
// @unionOfObjects:回来指定特色的值的数组,不去重
NSMutableArray *accouAr = [self->listArr valueForKeyPath:@"@distinctUnionOfObjects.account"];
- 运用NSPredicate从数组查找特定条件的元素
- 选择选中的标准数据
- 城市查找
- 多个过滤条件的拼接:银行列表的过滤
- 字符串数组的过滤(数组元素为系统的自有类型)
- Core Data的数据查询
- 运用谓词进行数据分组 (数组元素为自定义类型)
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"account == %@", key];
NSArray *arFiltered = [ listArr filteredArrayUsingPredicate:predicate];//以必定的条件过滤listArr数组,即进行大数据查找。
I NSPredicate的运用
- 谓词(NSPredicate)
是Objective-C中针对数据调集的一种逻辑选择条件,它类似于数据库中SQL语句对数据选择的束缚束缚条件。
Objective-C中的谓词常常用来从数组(Array)、调集(Set)等数据调集中选择数据元素,谓词束缚条件封装在NSPredicate方针中,可通过类函数predicateWithFormat和逻辑束缚语句进行初始化
-
在进行一些数据的选择的时候常常运用到它:
CoreData的数据查询、按照特定条件(日期)排序的数据、从数组进行数据查询
例如: 以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找 -
与正则表达式结合运用进行数据格式的校验
1.1NSPredicate在正则表达式的运用
- NSPredicate在正则表达式的运用
kunnan.blog.csdn.net/article/det…
NSPredicate在正则表达式的运用:束缚UITextField只能输入金额的正则表达式(0. .00)
- 身份证校验
blog.csdn.net/z929118967/…
1.2 方针数组按照日期分组排序
- 将含有日期特色的方针数组按照日期从头分组
- 将方针数组按照时间戳排序
kunnan.blog.csdn.net/article/det…
II 从数组查找特定条件的元素
2.1 选择选中的标准数据
- 通过 isSelected 选择选中的标准数据
- (NSString *)SpecValIds{
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isSelected == %d",YES];
NSMutableArray *tmparr = [self.platProductAttributeAndSpecificationDto.ProductSpecificationDtos filteredArrayUsingPredicate:predicate];
NSArray *editReturnedModeltmparr = [tmparr valueForKeyPath:@"@distinctUnionOfObjects.id"];
NSString *string = [editReturnedModeltmparr componentsJoinedByString:@","];// iOS 将数组中的元素用符号拼接字符串的方法
return string;
}
2.2 城市查找
blog.csdn.net/z929118967/…
2.3 多个过滤条件的拼接:银行列表的过滤
- 多个过滤条件的拼接
#pragma mark - ******** //列表的银行过滤
- (void)predicateBankList{
if ([Session Instance].arrOnlySupportBankList.count == 0) {
return;
}
NSMutableString *stringpredicate = [NSMutableString string] ;
// for (NSString *code in ) {
// if ([code isEqualToString:[Session Instance].arrOnlySupportBankList[0]]) {
// [stringpredicate appendFormat:@" strBankNO == %@ ",code];
// }else {
// [stringpredicate appendFormat:@" strBankNO == %@ ",code];
// }
// }
NSInteger count = [Session Instance].arrOnlySupportBankList.count;
for (int i = 0; i<count;i++) {
if (count == 1) {
[stringpredicate appendFormat:@" strBankNO == '%@' ",[Session Instance].arrOnlySupportBankList[i]];
}else if (count>1){
if (i == 0) {
[stringpredicate appendFormat:@" strBankNO == '%@' ",[Session Instance].arrOnlySupportBankList[i]];
}else{
[stringpredicate appendFormat:@"or strBankNO == '%@' ",[Session Instance].arrOnlySupportBankList[i]];
}
}
}
if ([stringpredicate isEqualToString:@"" ] ) {
return;
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:stringpredicate];
self.bankListDepositCard = [NSMutableArray arrayWithArray:[ self.bankListDepositCard filteredArrayUsingPredicate:predicate]];
self.bankListCreditCard = [NSMutableArray arrayWithArray:[ self.bankListCreditCard filteredArrayUsingPredicate:predicate]];
}
2.4 字符串数组的过滤(数组元素为系统的自有类型)
- 字符串数组的过滤
/**
BankInfoData 方针的 的银行卡编号是否包含在 arrOnlySupportBankList 银行卡编号数组中
@return bool
*/
- (BOOL)isaBankSelectedEqualToBusinessBank:(KNData*)data{
NSArray *arrOnlySupportBankList= [KNSession Instance].arrOnlySupportBankList;//kevin
NSArray *tmp = [NSArray array];
NSString *stringpredicate = [NSString stringWithFormat:@" self == '%@'",data.strBankNO];
NSPredicate *predicate = [NSPredicate predicateWithFormat:stringpredicate];
tmp = [NSMutableArray arrayWithArray:[ arrOnlySupportBankList filteredArrayUsingPredicate:predicate]];
if (tmp.count>0) {
return YES;
}else{
return NO;
}
}
2.5: Core Data的数据查询
- 比如:保存未读音讯
#pragma mark - 保存未读音讯
/** 先查询,在修正 */
+ (void)saveMessageWithMessage:(IPMessageDetailData*)data{
if (data.messageId == nil || data == nil){
return;
}
NSManagedObjectContext *context = [IPMessageDataTool shareContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"KNMessage" inManagedObjectContext:context];
// 设置排序(按照messageId降序)
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"messageId" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:sort];
// 设置条件过滤(查找name中包含字符串"Itcast-1"的记录,留心:设置条件过滤时,数据库SQL语句中的%要用*来替代,所以%Itcast-1%应该写成*Itcast-1*)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"messageId = %@ AND operateID = %@",data.messageId,[SessionMgr Instance].operateID];
request.predicate = predicate;
// 履行央求
// request.fetchLimit = 50;
NSError *error = nil;
NSArray *objs = [context executeFetchRequest:request error:&error];
if (error) {
[NSException raise:@"查询过错" format:@"%@", [error localizedDescription]];
}
Message *tmpMessage;
if (objs.count>0) {
tmpMessage = objs[0];
return;
}else{
tmpMessage = [NSEntityDescription insertNewObjectForEntityForName:@"Message" inManagedObjectContext:context];
}
tmpMessage.messageExpiredTime = data.messageExpiredTime;
tmpMessage.messageIssueTime = data.messageIssueTime;
tmpMessage.messageId = data.messageId;
tmpMessage.messageTitle = data.messageTitle;
tmpMessage.operateID = [SessionMgr Instance].operateID;
tmpMessage.isRead = NO;
BOOL success = [context save:&error];
if (!success) {
[NSException raise:@"拜访数据库过错" format:@"%@", [error localizedDescription]];
}
}
2.6 运用谓词进行数据分组 (数组元素为自定义类型)
- 过滤 Style 查找数据
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Style == %@", [[NSNumber numberWithInteger:type] description]];
NSArray *arFiltered = [ model.List filteredArrayUsingPredicate:predicate];//以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找。
model.List = [NSMutableArray arrayWithArray:arFiltered];
return model;
- 过滤type 查找电子签名的数据
查找电子签名的数据【防止遍历数组 certificateInfoList,判别type=8】
- (CRMcertificateInfoListDto *)getSignimgURLCRMcertificateInfoListDto{
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"type == %@", [[NSNumber numberWithInteger:CRMcertificateInfoListDtotype4Sign] description]];
NSArray *arFiltered = [ self.certificateInfoList filteredArrayUsingPredicate:predicate];//以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找。
CRMcertificateInfoListDto *dto = nil;
if(arFiltered.count>0){
dto = arFiltered.firstObject;
}
return dto;
}
2.7 将 NSArray 转换为 NSDictionary 进行判别是否包含指定元素,将时间复杂度降低到 O(1) 等级
- 运用
+ (NSValue *)valueWithPointer:(nullable const void *)pointer;
将NSArray进行转换NSDictionary - 运用
@property (nullable, readonly) void *pointerValue;将NSDictionary转为NSArray
字典的键
是数组存储的元素
确保后续通过 objectForKey: 判别是否存在指定的 元素
字典的值
是数组的索引值
确保字典可以恢复为数组
// 将数组转为字典
+ (NSDictionary<NSNumber *, id> *)arr2Dic:(NSArray *)arr {
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
mutableDic[[NSValue valueWithPointer:(__bridge const void * _Nullable)(obj)]] = @(idx);// 数组可能存在相同的元素,将 `NSValue` 切换到自定义类型即可
}];
return [mutableDic copy];
}
// 将字典转为数组
+ (NSArray*)dic2Arr:(NSDictionary<NSValue *, NSNumber *> *)dic {
NSInteger length = dic.count;
NSMutableArray *mutableArr = [NSMutableArray arrayWithCapacity:100];
// 先占位
for (int i=0; i<length; i++) {
[mutableArr addObject:[NSNull null]];
}
[dic enumerateKeysAndObjectsUsingBlock:^(NSValue * _Nonnull key, NSNumber * _Nonnull obj, BOOL * _Nonnull stop) {
NSInteger idx = obj.intValue;
mutableArr[idx] = (__bridge id _Nonnull)(key.pointerValue);
}];
return [mutableArr copy];
}
- 检验
NSLog(@"检验:(没有抵触的情况下,只需hash 一次)");
// targetObj 在数组中心
NSObject *targetObj = [ViewController new];
NSDictionary *dic = [self arr2Dic:arr];
if ([dic objectForKey:[NSValue valueWithPointer:(__bridge const void * _Nullable)(targetObj)]]) {
NSLog(@"key 存在");
}
III 、束缚UITextField只能输入金额的正则表达式(0. .00)
在UITextField的署理里面运用正则表达式完成输入束缚
束缚UITextField只能输入金额
/**
束缚UITextField只能输入金额的正则表达式
@param textField <#textField description#>
@param range <#range description#>
@param string <#string description#>
@return <#return value description#>
*/
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSInteger len = range.length > 0?([textField.text length] - range.length): ([textField.text length] + [string length]);
if(len > 20){
return false;
}
////
NSString * str = [NSString stringWithFormat:@"%@%@",textField.text,string];
return [QCT_Common isAmoutshouldChangeCharactersInRange:str];
}
- 正则表达式
+ (BOOL)isAmoutshouldChangeCharactersInRange:(NSString*)str{
//匹配以0开头的数字
NSPredicate * predicate0 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^[0][0-9]+$"];
//匹配两位小数、整数
NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^(([1-9]{1}[0-9]*|[0])\.?[0-9]{0,2})$"];
return ![predicate0 evaluateWithObject:str] && [predicate1 evaluateWithObject:str] ? YES : NO;
}
see also
iOS数据查找技巧: kunnan.blog.csdn.net/article/det…
- 运用NSPredicate进行数据选择:从数组查找特定条件的元素(从数组中选择type=8的电子签名数据,防止遍历数组 certificateInfoList)
- 正则表达式