zoukankan      html  css  js  c++  java
  • 对数组中的元素去重复

     

    NSArray *array = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
    • 1.第一种方法:开辟新的内存空间,然后判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化。效率分析:时间复杂度为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

    • 2.第二种方法:利用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);
      //需要结果有序的话  就用快速枚举排序
    • 3.利用集合NSSet的特性(确定性、无序性、互异性),放入集合就自动去重了。但是它与字典拥有同样的无序性,所得结果顺序不再与原来一样。如果不要求有序,使用此方法与字典的效率应该是差不多的。效率分析:时间复杂度为O (n):
    NSSet *set = [NSSet setWithArray:array];
    NSArray *resultArray = [set allObjects];
    NSLog(@"%@", resultArray);
    
    //使用过有序集合
    NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
    NSLog(@"%@", set.array);
  • 相关阅读:
    Django的rest_framework的视图之基于通用类编写视图源码解析
    Django的rest_framework的视图之Mixin类编写视图源码解析
    Django1.0和2.0中的rest_framework的序列化组件之超链接字段的处理
    Django的restframework的序列化组件之对单条数据的处理
    Django2.0的path方法无法使用正则表达式的解决办法
    算法的时间复杂度和空间复杂度简单理解
    回归后端分页本质,理清后端分页思路
    SQL Server 2008R2向表中添加字段
    Asp.net IIS 服务器配置远程访问
    linux write 命令
  • 原文地址:https://www.cnblogs.com/jinlianglu/p/6476508.html
Copyright © 2011-2022 走看看