對數組中的元素去重複

 

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);
相關文章
相關標籤/搜索