相信每個軟件開發(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中的謂詞搜素