判断数组中是否存在某元素,不存在则加入的两种方法比较

问题

遇到一需求,需要将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个的时候,体现出了方法二的优势:

屏幕快照 2017-05-16 下午12.26.09.png

而后注意到NSMutableSet有一个从数组中添加元素的方法,就一起试了一下:

//方法三
NSLog(@"~~");
NSMutableSet *set1 = [NSMutableSet setWithArray:array];
[set1 addObjectsFromArray:addArr];
NSLog(@"~~");

结果还是方法二快了一些,for in的原因吗?:

屏幕快照 2017-05-16 下午2.00.44.png

结论

利用NSSet的唯一性特性(利用了Hash Table),明显在数据量大的时候效率比较高。
NSArray 的containsObject 这个方法,内部应该是去遍历了?不然为什么慢这么多

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容