携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第34天,点击查看活动概略

前言

  • 运用方针操作符数组查找特定的元素:kunnan.blog.csdn.net/article/det…
//     @distinctUnionOfObjects:回来指定特色去重后的值的数组
//    @unionOfObjects:回来指定特色的值的数组,不去重
    NSMutableArray *accouAr = [self->listArr valueForKeyPath:@"@distinctUnionOfObjects.account"];
  • 运用NSPredicate从数组查找特定条件的元素
  1. 选择选中的标准数据
  2. 城市查找
  3. 多个过滤条件的拼接:银行列表的过滤
  4. 字符串数组的过滤(数组元素为系统的自有类型)
  5. Core Data的数据查询
  6. 运用谓词进行数据分组 (数组元素为自定义类型)
        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 方针数组按照日期分组排序

  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 运用谓词进行数据分组 (数组元素为自定义类型)

  1. 过滤 Style 查找数据
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Style == %@", [[NSNumber numberWithInteger:type] description]];
    NSArray *arFiltered = [  model.List filteredArrayUsingPredicate:predicate];//以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找。
    model.List = [NSMutableArray arrayWithArray:arFiltered];
    return model;
  1. 过滤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…

  1. 运用NSPredicate进行数据选择:从数组查找特定条件的元素(从数组中选择type=8的电子签名数据,防止遍历数组 certificateInfoList)
  2. 正则表达式