一、利用NSDictionary的AllKeys方法
NSArray *array = @[@"1",@"2",@"7",@"9",@"8",@"7",@"8",@"3",@"2",@"4",@"2",@"1",@"5",@"6",@"5"];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSString *value in array) {
[dict setValue:value forKey:value];
}
NSLog(@"result===%@",[dict allKeys]);
打印结果
result===(7,3,8,4,9,5,1,6,2
)
将数组的元素存入一个字典,利用利用AllKeys或者AllValues取得字典的所有键或值,但是结果是无序的
二、创建新的数组
NSArray *array = @[@"1",@"2",@"7",@"9",@"8",@"7",@"8",@"3",@"2",@"4",@"2",@"1",@"5",@"6",@"5"];
NSMutableArray *resultArray = [NSMutableArray array];
for (NSString *value in array) {
if (![resultArray containsObject:value]) {
[resultArray addObject:value];
}
}
NSLog(@"resultArray===%@",resultArray);
运行结果
resultArray===(1,2,7,9,8,3,4,5,6)
三、利用NSSet特性,放入集合自动去重复
NSSet的特性:确定性、无序性、互异性
这种方法更快,利用NSSet不会添加重复元素的特性。不过去重的数组没有进行排序,如果需要排序,可以使用NSSortDescriptor类。
NSArray *array = @[@"1",@"2",@"7",@"9",@"8",@"7",@"8",@"3",@"2",@"4",@"2",@"1",@"5",@"6",@"5"];
NSSet *set = [NSSet setWithArray:array];
NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]];
NSArray *setArray = [set sortedArrayUsingDescriptors:sortDesc];
NSLog(@"setArray===%@",setArray);
运行结果
setArray===(1,2,3,4,5,6,7,8,9)
NSSet和NSArray的区别
NSSet
- 无序、不重复的。存放到NSSet中的内容并不会排序与添加顺序也没关系
- 通过anyObjetc来访问单个元素
- 遍历NSSet中的每个元素。通过for in循环便利
- 好处:效率高
- 应用场景:1、比如重用Cell的时候,从缓存池中随便获取一个就可以了,无需按照指定顺序来获取2、当需要把数据存放到一个集合中,然后判断集合中是否有某个对象的时候
NSArray
- 有序的、可以重复对象。对象的顺序是按照添加的顺序来保存的
- 好处:有序访问
- 可以通过下标访问单个元素
- 应用场景:在绝大多数需要依赖顺序的情况下(比如tableView的数据源集合,在实际操作中要根据下标来获取对象)
四、私有API,valueForKeyPath去重复
NSArray *array = @[@"1",@"2",@"7",@"9",@"8",@"7",@"8",@"3",@"2",@"4",@"2",@"1",@"5",@"6",@"5"];
NSArray *result = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"result===%@",result);
打印结果
2019-09-07 23:34:13.769169+0800 ZSLoadDemo[60246:276864] result===(2,3,4,5,6,7,8,1,9
)
valueForKeyPath是私有API,并且新生成的数组 是无序的