iOS字典的排序问题

在日常开发中,经常会遇到根据字典的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
)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,188评论 0 48
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,777评论 0 4
  • 、6一、基本知识 1.JDK和JRE的区别 答:JDK是java语言开发工具包,包含JRE和开发工具(javac....
    梦游的沙师弟阅读 5,019评论 0 4
  • 首先,我完成了晨诵,然后,完成了英语作业和数学作业,看了《口袋里的爸爸》三本,参加了三天架子鼓大师集训课。三天里...
    冰糖小妹葫芦大哥阅读 1,562评论 0 1
  • sdfdsf 到了某个年纪你就会知道 一个人的日子真的难熬 渐渐开始尝到孤单的味道 时间在敲打着你的骄傲...
    指尖阅读 3,207评论 0 1

友情链接更多精彩内容