iOS小技能:参数名ASCII码从小到大排序、对象数组排序

携手发明,一起成长!这是我参加「日新方案 8 月更文应战」的第10天,点击检查活动概略

导言

使用KVC的 valueForKeyPath API、NSPredicate、数组的sortedArrayUsingComparator:API进行完结。

iOS小技术:参数名ASCII码从小到大排序、对象数组排序

I 参数名ASCII码从小到大排序(字典序)

  • iOS 安全标准攻略之【对央求参数进行签名】央求参数按照ASCII码从小到大排序、拼接、加密(选用递归的方法进行完结)使用事例:条码支付综合前置渠道恳求退款

———————————————— 版权声明:本文为CSDN博主「#群众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…

/**
 递归
 - 处理key对应的Value是字典的状况
     request body参数名ASCII码从小到大排序(字典序),
 运用URL键值对的格局拼接成字符串    (key1=value1&key2=value2…)
 */
+ (NSString *)sortedDictionary:(NSMutableDictionary *)originParam {
    NSDictionary *dict = originParam;
    NSMutableString *contentString =[NSMutableString string];
    NSArray *keys = [dict allKeys];
    //按字母次第排序
    NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];///*options:NSNumericSearch Added in 10.2; Numbers within strings are compared using numeric value, that is, Foo2.txt < Foo7.txt < Foo25.txt; only applies to compare methods, not find */
    }];
    //拼接字符串
    for (NSString *categoryId in sortedArray) {
#pragma mark - ******** todo value区分数组[,]、字符串、字段政策{}
        id  categoryIdV = [dict objectForKey:categoryId];
//
        if( [categoryIdV isKindOfClass:NSString.class]){
        }
        else         if( [categoryIdV isKindOfClass:NSDictionary.class]){
            categoryIdV = [self sortedDictionary:categoryIdV];
            categoryIdV = [NSString stringWithFormat:@"%@%@%@",@"{",categoryIdV,@"}"];
        }
        // 数组就[]
        else         if( [categoryIdV isKindOfClass:NSArray.class]){
            categoryIdV =   [self sortedDictionaryArr:categoryIdV];
        }
        if ([contentString length] <= 0) {
            //第一个参数
        }else{
            [contentString appendString:@"&"];
        }
        [contentString appendFormat:@"%@=%@", categoryId,categoryIdV ];
    }
    NSLog(@"%@",contentString);
    return contentString;
}

II 数组排序

2.1 政策数组按照日期从头分组

运用谓词进行数据分组 (数组元素为 自定义类型)

iOS NSPredicate的使用攻略之【从数组查找特定条件的元素】(从数组中挑选type=8的电子签名数据,避免遍历数组 certificateInfoList) ———————————————— 版权声明:本文为CSDN博主「#群众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…

//2.按照日期进行分组展示
//     从头按照日期进行分组组织数据
//     找出不重复的日期
    /**
  政策操作:
     针对数组的状况
     @distinctUnionOfObjects:回来指定特色去重后的值的数组
     @unionOfObjects:回来指定特色的值的数组,不去重
     特色的值不能为空,否则发生反常。
*/
    //1)取出日期分组 
    NSArray *arDistinct = [maTemp valueForKeyPath:@"@distinctUnionOfObjects.strDateCreated"];//maTemp是一些含有日期特色的政策集结
    //2)构建排序规矩NSComparator
    NSComparator cmptr = ^(id obj1, id obj2){
        NSString *strData1 = obj1;
        NSString *strData2 = obj2;
        NSComparisonResult ret = [strData1 compare:strData2];
        return ret;
    }; 
//     3)按数字从小到大进行排序(将最新的数据闪现在前面)
    NSArray  *arSorted = [arDistinct sortedArrayUsingComparator:cmptr];
    arSorted = arSorted.reverseObjectEnumerator.allObjects;//次第取反
    NSPredicate *predicate = nil;
//     4)按照日期进行分组
    for (NSString *strDateCreated in arSorted)
    {
        predicate = [NSPredicate predicateWithFormat:@"strDateCreated == %@", strDateCreated];
        NSArray *arFiltered = [maTemp filteredArrayUsingPredicate:predicate];//以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找。      
        OrderQueryGroupData *data = [OrderQueryGroupData alloc];
        data.strDateCreated = strDateCreated;
        data.maOrderData = [NSMutableArray arrayWithArray:arFiltered];
        data.maOrderDataF = [IPOrderDataFrame frameListWith:data.maOrderData];
        [self.maOrderQuery addObject:data];
    }

2.2 回来间隔政策地址最近的POI

需求:对高德SDK回来的当时方位POI数组按照间隔排序

+(NSString*)POInamebyArr:(NSArray*)arr{
    // 回来间隔政策地址最近的POI:对元素依据distance特色进行排序,回来第一个(distance当时POI与当时方位的间隔)
    NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSComparisonResult(TencentLBSPoi* obj1, TencentLBSPoi* obj2) {
        return [[NSNumber numberWithDouble:obj1.distance].description compare:[NSNumber numberWithDouble: obj2.distance].description options:NSNumericSearch];
        ///
        ///
    }];
//————————————————
//版权声明:本文为CSDN博主「iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//原文链接:https://blog.csdn.net/z929118967/article/details/115242819
    TencentLBSPoi *firstObject = sortedArray.firstObject;
    return firstObject.name;
}

2.3 将数组按照时间戳排序

/**
 IOS中将政策数组按照时间戳排序
         weakSelf.viewModel.listModels=   [QCT_Common sortedArrayUsingObjectKey:@"createTime" arr:weakSelf.viewModel.listModels];
 */
- (NSMutableArray*)sortedArrayUsingObjectKey:(NSString*)key arr:(NSArray*)listModels{
    //1)取出日期分组
    NSString* valueForKeyPath = FMSTR(@"@distinctUnionOfObjects.%@",key);
    NSArray *arDistinct = [listModels valueForKeyPath:valueForKeyPath];
    //listModels是一些含有日期特色的政策集结
    //2)构建排序规矩NSComparator
    NSComparator cmptr = ^(id obj1, id obj2){
        NSString *strData1 = obj1;
        NSString *strData2 = obj2;
        NSComparisonResult ret = [strData1 compare:strData2];
        return ret;
    };
//     3)按数字从小到大进行排序(将最新的数据闪现在前面)
    NSArray  *arSorted = [arDistinct sortedArrayUsingComparator:cmptr];
    arSorted = arSorted.reverseObjectEnumerator.allObjects;//次第取反
    NSMutableArray *newSorted_arr = [NSMutableArray array];
    //     4)按照日期进行分组
        for (NSString *strDateCreated in arSorted)
        {
            NSPredicate*   predicate = [NSPredicate predicateWithFormat:@"createTime == %@", strDateCreated];
            NSArray *arFiltered = [listModels filteredArrayUsingPredicate:predicate];//以必定的条件(特定日期)过滤maTemp数组,即进行大数据查找。
            [newSorted_arr addObjectsFromArray:arFiltered];
        }
    return newSorted_arr;
//        ————————————————
//        版权声明:本文为CSDN博主「#群众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//        原文链接:https://blog.csdn.net/z929118967/article/details/115242819
//    ————————————————
//    版权声明:本文为CSDN博主「#群众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//    原文链接:https://blog.csdn.net/z929118967/article/details/113499172
}

see also

群众号:iOS逆向