zoukankan      html  css  js  c++  java
  • iOS里面集合、字典、集之间的那些事

    转自://http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=404356053&idx=5&sn=0ccb4ffa5bd12986898f57aef66edbce&scene=0#wechat_redirect

    感觉博主写的还不错,以前对这三个还不是很理解,看了这一篇博客,感觉又不一样啦。

    1、对数组中的元素去重复

    例如:

    NSArray *array = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];

    参考答案:

    • 第一种方法:开辟新的内存空间,然后判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化。效率分析:时间复杂度为O ( n2):

    NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:array.count];
    // 外层一个循环
    for (NSString *item in array) {
       // 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历
       // 时间复杂度为O ( n^2 )而不是O (n)
        if (![resultArray containsObject:item]) {
          [resultArray addObject:item];
        }
    }
    NSLog(@"resultArray: %@", resultArray);

    补充:原来集合操作可以通过valueForKeyPath来实现的,去重可以一行代码实现:

    array = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"%@", array);

    但是返回的结果是无序的,与原来的顺序不同。大家可以阅读:Collection Operators

    • 第二种方法:利用NSDictionary去重,字典在设置key-value时,若已存在则更新值,若不存在则插入值,然后获取allValues。若不要求有序,则可以采用此种方法。若要求有序,还得进行排序。效率分析:只需要一个循环就可以完成放入字典,若不要求有序,时间复杂度为O(n)。若要求排序,则效率与排序算法有关:

    NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];
    for (NSString *item in array) {
        [resultDict setObject:item forKey:item];
    }
    NSArray *resultArray = resultDict.allValues;
    NSLog(@"%@", resultArray);

    如果需要按照原来的升序排序,可以这样:

    resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
      NSString *item1 = obj1;
      NSString *item2 = obj2;
      return [item1 compare:item2 options:NSLiteralSearch];
    }];
    NSLog(@"%@", resultArray);
    • 第三种方法:利用集合NSSet的特性(确定性、无序性、互异性),放入集合就自动去重了。但是它与字典拥有同样的无序性,所得结果顺序不再与原来一样。如果不要求有序,使用此方法与字典的效率应该是差不多的。效率分析:时间复杂度为O (n):

    NSSet *set = [NSSet setWithArray:array];
    NSArray *resultArray = [set allObjects];
    NSLog(@"%@", resultArray);

    如果要求有序,那就得排序,比如这里要升序排序:

    resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
      NSString *item1 = obj1;
      NSString *item2 = obj2;
      return [item1 compare:item2 options:NSLiteralSearch];
    }];
    NSLog(@"%@", resultArray);

    补充

    NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
    NSLog(@"%@", set.array);
  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/layios/p/5289712.html
Copyright © 2011-2022 走看看