如何去除IOS數(shù)組中重復(fù)的數(shù)據(jù)?

相信每個軟件開發(fā)都會遇到這樣的問題,我也不例外,而且遇到好多次,之前每次都用相同的方法,無非是for循環(huán)或者是containsObject之類的,雖說后者很好用,但建議還是多了解一些其它的方法,拓展一下自己的知識面。

現(xiàn)在有如下幾種方法:

1:首先就說說比較常用的 - (BOOL)containsObject:(ObjectType)anObject;
代碼如下:

NSArray*  array = @[@"9",@"1",@"5",@"6",@"5",
                                 @"2",@"8",@"7",@"3",@"0",
                                 @"5",@"6",@"4",@"8"];
  
NSMutableArray* temp = [[NSMutableArray alloc] init];
    for (NSString** str in array)
    {
       if (![temp containsObject:str])
        {
            [temp addObject:str];
        }
    }
    NSLog(@"temp:%@",temp);

// 打印如下:
temp:(
    9,  1,  5,  6,  2,  8,  7,  3,  0,  4
)

2:第二種也就是for循環(huán),推薦方法:先給數(shù)組排序,然后再去重(方法自己參考著寫)

3:利用NSSet集合的方法
代碼如下:

NSArray*  array = @[@"9",@"1",@"5",@"6",@"5",
                               @"2",@"8",@"7",@"3",@"0",
                               @"5",@"6",@"4",@"8"];

 NSSet* set = [[NSSet alloc] initWithArray:array];
    NSLog(@"set:%@",[set allObjects]);

// 打印如下:
set:(
    2,  3,  4, 5, 6, 7, 0, 8, 1,  9
)

由打印結(jié)果可以看出,雖然已經(jīng)把重復(fù)的數(shù)據(jù)去掉了。但是又會出現(xiàn)一個新的問題,就是NSSet集合的數(shù)據(jù)本來就是數(shù)據(jù)的無序集合,所以篩選出來的數(shù)據(jù),是無序的,根據(jù)不同的需求,個人建議,還是最好輸出有序的數(shù)據(jù)集合,這樣對數(shù)據(jù)的選擇不會有太多的問題,以免之后遇到類似的坑,所以針對NSSet的無序集合,出現(xiàn)了一個相對的NSOrderedSet的有序結(jié)合。

4: NSOrderedSet的有序集合
代碼如下:

NSArray*  array = @[@"9",@"1",@"5",@"6",@"5",
                               @"2",@"8",@"7",@"3",@"0",
                               @"5",@"6",@"4",@"8"];

NSOrderedSet * orderSet = [[NSOrderedSet alloc] initWithArray:array];
NSLog(@"orderSet:%@",orderSet); 

// 打印如下:
**orderSet**:{(
    9, 1, 5, 6, 2, 8, 7, 3, 0, 4
)}

5: 利用 - (void)setValue:(nullable ObjectType)value forKey:(NSString *)key
代碼如下:

NSArray**  array = @[@"9",@"1",@"5",@"6",@"5",
                               @"2",@"8",@"7",@"3",@"0",
                               @"5",@"6",@"4",@"8"];

NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
    for (NSString* string in array)
    {
        [dic setValue:string forKey:string];
    }
    NSLog(@"dic:%@",[dic allKeys]);
 
// 打印如下:
**dic**:(
    7, 3, 8, 4, 0, 9, 5, 1, 6,  2
)

這個方法打印出來也是亂序的,具體用這個方法如何打印出來有序的,暫時還沒想到,如有需求,請參考方法1和方法4.

6: 這個方法,也是在網(wǎng)上查的,就是所謂的鍵值編碼(KVO)
代碼如下:

NSArray*  array = @[@"9",@"1",@"5",@"6",@"5",
                               @"2",@"8",@"7",@"3",@"0",
                               @"5",@"6",@"4",@"8"];

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

// 打印如下:
array: (
    2,  3, 4, 5, 6, 7, 0,  8, 1,  9
)

這個方法輸出的也是無序的,所以如果需要輸入有序的數(shù)據(jù),請參考方法1和方法4.

7: 使用block 塊遍歷整個數(shù)組:

   NSArray*  array = @[@"9",@"1",@"5",@"6",@"5",
                        @"2",@"8",@"7",@"3",@"0",
                        @"5",@"6",@"4",@"8"];
    
   NSMutableArray* tempArray = [[NSMutableArray alloc] init];
   [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        if (![tempArray containsObject:obj]) {
            [tempArray addObject:obj];
        }
        NSLog(@"%lu is %@",(unsigned long)idx,obj);
        // *stop = YES; (下面有解釋)
    }];
   NSLog(@"tempArray:%@",tempArray);
    
   /**
     *  備注: enumerateObjectsUsingBlock(有三個參數(shù),如下解釋)
     *    1: obj: 當(dāng)前對象 (這里聲明數(shù)組里面你放入的是什么類型的東西,不確定的話就直接id類型最靠譜)
     *    2: inx: 其索引 (數(shù)組的下標 )
     *    3:stop: 引用的Boolen值(這個bool值,決定是否繼續(xù)循環(huán)。如果有NO,繼續(xù)循環(huán)下去。如果為YES ,停止循環(huán))
     */


打印如下:
2016-12-17 13:48:28.057 myProject[745:27588] 0 is 9
2016-12-17 13:48:28.057 myProject[745:27588] 1 is 1
2016-12-17 13:48:28.057 myProject[745:27588] 2 is 5
2016-12-17 13:48:28.057 myProject[745:27588] 3 is 6
2016-12-17 13:48:28.057 myProject[745:27588] 4 is 5
2016-12-17 13:48:28.057 myProject[745:27588] 5 is 2
2016-12-17 13:48:28.058 myProject[745:27588] 6 is 8
2016-12-17 13:48:28.058 myProject[745:27588] 7 is 7
2016-12-17 13:48:28.058 myProject[745:27588] 8 is 3
2016-12-17 13:48:28.058 myProject[745:27588] 9 is 0
2016-12-17 13:48:28.058 myProject[745:27588] 10 is 5
2016-12-17 13:48:28.058 myProject[745:27588] 11 is 6
2016-12-17 13:48:28.059 myProject[745:27588] 12 is 4
2016-12-17 13:48:28.059 myProject[745:27588] 13 is 8

2016-12-17 13:48:28.059 myProject[745:27588] tempArray:(
    9, 1,  5,  6,  2, 8,  7,  3, 0, 4
)
 

這個方法輸出的也是有序的,但是有點繁瑣,建議使用方法1和方法4.

8: 謂詞搜索 (篩選兩個數(shù)組之間的異同,謂詞搜索可以結(jié)合SQL操作,具體講解下方有參考鏈接)

 /**
  *  獲取兩個數(shù)組之間的相同元素:@"(SELF IN %@)"
  */
 NSArray *filterArray = @[@"1", @"2",@"3"];
 NSArray *array = @[@"0", @"1", @"2", @"4",@"5"];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray]; 
 NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);

打印結(jié)果:
2016-12-17 14:29:28.059 myProject[879:52365] (
    1,  2
)

關(guān)于KVO,其實是很好用的,如果有深入了解的,有個鏈接,可以參考一下,里面有很多常用的方法。

本文參考鏈接如下,謝謝提供的分享:
數(shù)組去重方法分享鏈接
KVO知識分享鏈接
NSArray數(shù)組的用法
IOS中的謂詞搜素

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 站在前輩的肩膀上前行 UIKit框架和Foundation框架 所有的Mac OS X和IOS程序都是由大量的對象...
    zysmoon閱讀 8,931評論 0 16
  • 來自網(wǎng)絡(luò) 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會...
    用心在飛閱讀 920評論 5 4
  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 501評論 0 0
  • http://www.devstore.cn/essay/essayInfo/6525.html【原文地址】 序言...
    起名好難_fz閱讀 716評論 1 1
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    獨酌丿紅顏閱讀 2,462評論 18 60

友情鏈接更多精彩內(nèi)容