數組去重

一、對數組中的元素去重複算法

例如:數組

 

1
NSArray *array = @[@ "12-11" , @ "12-11" , @ "12-11" , @ "12-12" , @ "12-13" , @ "12-14" ];

參考答案:spa

  • 第一種方法:開闢新的內存空間,而後判斷是否存在,若不存在則添加到數組中,獲得最終結果的順序不發生變化。效率分析:時間複雜度爲O ( n2):code

 

 

1
2
3
4
5
6
7
8
9
10
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來實現的,去重能夠一行代碼實現:排序

 

1
2
array = [array valueForKeyPath:@ "@distinctUnionOfObjects.self" ];
NSLog(@ "%@" , array);

可是返回的結果是無序的,與原來的順序不一樣。你們能夠閱讀:Collection Operators內存

  • 第二種方法:利用NSDictionary去重,字典在設置key-value時,若已存在則更新值,若不存在則插入值,而後獲取allValues。若不要求有序,則能夠採用此種方法。若要求有序,還得進行排序。效率分析:只須要一個循環就能夠完成放入字典,若不要求有序,時間複雜度爲O(n)。若要求排序,則效率與排序算法有關:ci

 

 

1
2
3
4
5
6
NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];
for  (NSString *item  in  array) {
     [resultDict setObject:item forKey:item];
}
NSArray *resultArray = resultDict.allValues;
NSLog(@ "%@" , resultArray);

若是須要按照原來的升序排序,能夠這樣:string

 

1
2
3
4
5
6
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):it

 

 

1
2
3
NSSet *set = [NSSet setWithArray:array];
NSArray *resultArray = [set allObjects];
NSLog(@ "%@" , resultArray);

若是要求有序,那就得排序,好比這裏要升序排序:io

 

1
2
3
4
5
6
resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
   NSString *item1 = obj1;
   NSString *item2 = obj2;
   return  [item1 compare:item2 options:NSLiteralSearch];
}];
NSLog(@ "%@" , resultArray); 

 第四種方法

1
2
NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
NSLog(@ "%@" , set.array);
相關文章
相關標籤/搜索