• 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);
  • 相关阅读:
    Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP
    Atitit 2016年attilax事业成就表
    Atitit 知识管理的重要方法 数据来源,聚合,分类,备份,发布 搜索
    Atitit webservice发现机制 WS-Discovery标准的规范attilax总结
    Atitit 多元化战略 适合我们发展 的核心业务attilax总结
    Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结
    Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx
    Atitit zxing二维码qr码识别解析
    Atitit Data Matrix dm码的原理与特点
    Atitit 常用二维码对比(QR、PDF417、DM、汉信码 Aztec code maxicode
  • 原文地址:https://www.cnblogs.com/layios/p/5289712.html
Copyright © 2020-2023  润新知