iOS中数组的排序

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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:大海里的太阳原文地址:http://www.cnblogs.com/wxisme/ 前言 查找和排序算法是算...
    IT程序狮阅读 2,535评论 0 63
  • 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中...
    宝塔山上的猫阅读 1,106评论 1 21
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 以眼还眼以牙还牙,很多人心里是认同的,我其实也是认同的,这句话包含着多么畅快的快意恩仇,有时候可能是我们更加努力生...
    五木籽阅读 385评论 0 0
  • 我想我应该把你想象成一种不存在的东西,这样才能畅快。我是炎黄的子孙,我是女娲的后代,我是万绿丛中的一抹红…… 话题...
    木子言寺月阅读 322评论 0 2