对数组中的元素去重复

 

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);

转载于:https://www.cnblogs.com/jinlianglu/p/6476508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值