iOS字典的排序问题

作者: 爱搞事的Snoopy | 来源:发表于2017-02-12 11:32 被阅读4197次

在日常开发中,经常会遇到根据字典的Key对Value进行排序的问题,所以对于此类问题抽出一个通用方法,废话不多说,上代码.

/**
 对字典(Key-Value)排序 区分大小写

 @param dict 要排序的字典
 */
- (void)sortedDictionary:(NSDictionary *)dict{
    
    //将所有的key放进数组
    NSArray *allKeyArray = [dict allKeys];
    
    //序列化器对数组进行排序的block 返回值为排序后的数组
    NSArray *afterSortKeyArray = [allKeyArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id
    Nonnull obj2) {
        /**
          In the compare: methods, the range argument specifies the
          subrange, rather than the whole, of the receiver to use in the
          comparison. The range is not applied to the search string.  For
          example, [@"AB" compare:@"ABC" options:0 range:NSMakeRange(0,1)]
          compares "A" to "ABC", not "A" to "A", and will return
          NSOrderedAscending. It is an error to specify a range that is
          outside of the receiver's bounds, and an exception may be raised.
         
        - (NSComparisonResult)compare:(NSString *)string;
         
         compare方法的比较原理为,依次比较当前字符串的第一个字母:
         如果不同,按照输出排序结果
         如果相同,依次比较当前字符串的下一个字母(这里是第二个)
         以此类推
         
         排序结果
         NSComparisonResult resuest = [obj1 compare:obj2];为从小到大,即升序;
         NSComparisonResult resuest = [obj2 compare:obj1];为从大到小,即降序;
         
         注意:compare方法是区分大小写的,即按照ASCII排序
         */
        //排序操作
        NSComparisonResult resuest = [obj1 compare:obj2];
        return resuest;
    }];
    NSLog(@"afterSortKeyArray:%@",afterSortKeyArray);
    
    //通过排列的key值获取value
    NSMutableArray *valueArray = [NSMutableArray array];
    for (NSString *sortsing in afterSortKeyArray) {
        NSString *valueString = [dict objectForKey:sortsing];
        [valueArray addObject:valueString];
    }
    NSLog(@"valueArray:%@",valueArray);
}

代码中提到了排序是按照ASCII码排序,因为ASCII码表示区分大小写的,所以我们的排序结果也区分大小写.

ASCII表.jpg

如果不想区分大小写,可以在比较前,可以用lowercaseString方法将字符串转换为小写.代码如下

/**
 对字典(Key-Value)排序 不区分大小写
 
 @param dict 要排序的字典
 */
- (void)sortedDictionarybyLowercaseString:(NSDictionary *)dict{
    
    //将所有的key放进数组
    NSArray *allKeyArray = [dict allKeys];
    
    //序列化器对数组进行排序的block 返回值为排序后的数组
    NSArray *afterSortKeyArray = [allKeyArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id
    Nonnull obj2) {
/**
          In the compare: methods, the range argument specifies the
          subrange, rather than the whole, of the receiver to use in the
          comparison. The range is not applied to the search string.  For
          example, [@"AB" compare:@"ABC" options:0 range:NSMakeRange(0,1)]
          compares "A" to "ABC", not "A" to "A", and will return
          NSOrderedAscending. It is an error to specify a range that is
          outside of the receiver's bounds, and an exception may be raised.
         
        - (NSComparisonResult)compare:(NSString *)string;
         
         compare方法的比较原理为,依次比较当前字符串的第一个字母:
         如果不同,按照输出排序结果
         如果相同,依次比较当前字符串的下一个字母(这里是第二个)
         以此类推
         
         排序结果
         NSComparisonResult resuest = [obj1 compare:obj2];为从小到大,即升序;
         NSComparisonResult resuest = [obj2 compare:obj1];为从大到小,即降序;
         
         注意:compare方法是区分大小写的,即按照ASCII排序
         */
        //小写转化
        obj1 = [obj1 lowercaseString];
        obj2 = [obj2 lowercaseString];
        //排序操作
        NSComparisonResult resuest = [obj1 compare:obj2];
        return resuest;
    }];
    NSLog(@"afterSortKeyArray:%@",afterSortKeyArray);
    
    //通过排列的key值获取value
    NSMutableArray *valueArray = [NSMutableArray array];
    for (NSString *sortsing in afterSortKeyArray) {
        NSString *valueString = [dict objectForKey:sortsing];
        [valueArray addObject:valueString];
    }
    NSLog(@"valueArray:%@",valueArray);
}

简单测试代码

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Danny",@"Basd",@"12",@"Cerff",@"man",@"ABCDEFG",@"Sean",@"Cerf",nil];
    NSLog(@"dictionary:%@",dict);
    [self sortedDictionary:dict];

输出为:
2017-02-12 11:23:03.484 根据key对dictionary排序[6122:164377] dictionary:{
    ABCDEFG = 12345;
    Basd = Rddd;
    Cerf = Sean;
    Cerff = iiiii;
}
2017-02-12 11:23:03.484 根据key对dictionary排序[6122:164377] afterSortKeyArray:(
    ABCDEFG,
    Basd,
    Cerf,
    Cerff
)
2017-02-12 11:23:03.485 根据key对dictionary排序[6122:164377] valueArray:(
    12345,
    Rddd,
    Sean,
    iiiii
)

代码此时例子较多,就不都放上来了,大家可放心食用.

相关文章

  • iOS字典的排序问题

    在日常开发中,经常会遇到根据字典的Key对Value进行排序的问题,所以对于此类问题抽出一个通用方法,废话不多说,...

  • python3字典排序

    python3 字典排序 说实话,对字典进行排序,这个说法本身就有问题,实际上,你无法对操纵字典说,字典,在你的底...

  • iOS 字典排序

  • python常见问题集合

    两个列表合并成字典 元组遍历 排序问题 删除字典key

  • iOS 各种排序

    数组排序 数组中字典排序 数组中字典按照某个value排序 排序方法

  • Python dict排序

    sorted 函数按key值对字典排序 sorted 函数按value值对字典排序 字典列表排序

  • iOS 字典数组排序

    - (NSString *)rankAndJiaMiDic:(NSDictionary *)dic{ NSStri...

  • iOS数组字典排序(键值排序)

    iOS高级程序师技术群:622177838,期待你的加入 由于float类型排序,会因为整数部分位数不同的原因,造...

  • iOS 中文排序、数组、字典排序

    数组内中文排序 看够了复杂的中文排序封装代码,让我们来点小清新,其实苹果不但为我们提供好了排序方法,并且带有多音字...

  • Python 字典排序

    字典排序 问题 创建字典,并在迭代或序列化字典的时候控制元素的顺序。 解决方法 Python 提供的 collec...

网友评论

本文标题:iOS字典的排序问题

本文链接:https://www.haomeiwen.com/subject/mvlaittx.html