iOS小技能:引數名ASCII碼從小到大排序、物件陣列排序

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第10天,點選檢視活動詳情

引言

利用KVC的 valueForKeyPath API、NSPredicate、陣列的sortedArrayUsingComparator:API進行實現。

I 引數名ASCII碼從小到大排序(字典序)

———————————————— 版權宣告:本文為CSDN博主「#公眾號:iOS逆向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/z929118967/article/details/108195721 ```objectivec /**

遞迴

  • 處理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版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/z929118967/article/details/113499172

```objectivec //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陣列按照距離排序 ```objectivec +(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 將陣列按照時間戳排序

```objectivec /** 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逆向