数组去重 - iOS

一.删除重复数据

利用 valueForKeyPath 的方式

NSArray *arrData = @[@1, @2, @3, @4, @5, @1, @2, @3];
NSArray *arrResult = [arrData valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"Result:\n%@", arrResult);

同样,如果数组中存储的数据为对象的形式,也可以剔除对应 key 值的重复数据后再取值

NSArray *arrData = @[@{@"name":@"zhangsan", @"age":@"20"}, @{@"name":@"lisi", @"age":@"19"}, @{@"name":@"wangwu", @"age":@"22"}, @{@"name":@"zhaoliu", @"age":@"20"}, @{@"name":@"zhangsan", @"age":@"17"}, @{@"name":@"caoqi", @"age":@"28"}, @{@"name":@"shaoba", @"age":@"24"}];
// 根据 name 字段进行去重操作(注:若需要根据其它字段则将 name 字段变更为对应的字段即可 => @distinctUnionOfObjects.XXX)
NSArray *arrResult = [arrData valueForKeyPath:@"@distinctUnionOfObjects.name"];
NSLog(@"Result:\n%@", arrResult);

 

二.对数组中元素去重

1.开辟新内存空间,判断是否存在,遍历数组元素,若不存在则将该元素插入至新数组中,最终得到的结果顺序不发生变化.

NSArray *arrData = @[@1, @2, @3, @4, @5, @1, @2, @3];
NSMutableArray *arrResult = [NSMutableArray array];
    
for (NSString *key in arrData) {
    if (![arrResult containsObject:key]) {
        [arrResult addObject:key];
    }
}
NSLog(@"Result:\n%@", arrResult);

2.通过 NSDictionary 的 AllKeys(AllValues) 方式去重

将 NSArray 中元素插入字典中,字典设置 key value 时,若存在则更新,反之则将其插入,然后再获取AllKyes 或 AllValues 进行去重,最终得到的结果是无序的,若需要有序,则还需要进行排序操作.

NSArray *arrData = @[@1, @2, @3, @4, @5, @1, @2, @3];
NSMutableDictionary *dicResult = [NSMutableDictionary dictionary];
for (NSString *item in arrData) {
    [dicResult setObject:item forKey:item];
}
NSArray *arrResult = dicResult.allValues;
NSLog(@"Result:\n%@", arrResult);// 若需要排序,则可通过快速枚举方式进行排序

 

三.通过 NSSet 特性

NSSet 特性:确定性、无序性、互异性

通过 NSSet 特性将数组放入集合进行自动去重,但是它与字典一样是无序的,所以最终得到的结果是无序的.

NSArray *arrData = @[@1, @2, @3, @4, @5, @1, @2, @3];
NSSet *set = [NSSet setWithArray:arrData];
NSArray *arrResult = [set allObjects];
NSLog(@"Result:\n%@", arrResult);
            
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:arrData];// 有序集合
NSLog(@"Result:\n%@", orderedSet.array);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值