iOS数组去重复的方法

一、利用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,并且新生成的数组 是无序的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值