问题
遇到一需求,需要将b数组中的元素加入至a数组,且确保a数组元素的唯一性。
NSArray *arrayA = @[@"12345",@"23456",@"34567",@"45678",@"56789",@"678910",@"7891011",@"89101112",@"910111213",@"1011121314",@"1112131415",@"1213141516",@"1314151617",@"1415161718",@"1516171819"];
NSArray *arrayB = @[@"1617181920",@"17181920",@"56789"];
想到的两种方法:
//方法一
NSLog(@"~~");
NSMutableArray *newArr = [NSMutableArray arrayWithArray:arrayA];
for (NSString *str in arrayB) {
if(![newArr containsObject:str]){
[newArr addObject:str];
}
}
NSLog(@"~~");
//方法二
NSLog(@"~~");
NSMutableSet *set = [NSMutableSet setWithArray:array];
for (NSString *str in addArr) {
[set addObject:str];
}
NSLog(@"~~");
简单的比较了下效率,数据量少的时候log看不出差别,而后把arrayB扩大到16696个的时候,体现出了方法二的优势:
而后注意到NSMutableSet有一个从数组中添加元素的方法,就一起试了一下:
//方法三
NSLog(@"~~");
NSMutableSet *set1 = [NSMutableSet setWithArray:array];
[set1 addObjectsFromArray:addArr];
NSLog(@"~~");
结果还是方法二快了一些,for in的原因吗?:
结论
利用NSSet的唯一性特性(利用了Hash Table),明显在数据量大的时候效率比较高。
NSArray 的containsObject 这个方法,内部应该是去遍历了?不然为什么慢这么多