数组去重 - 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);

你可能感兴趣的:(数组去重 - iOS)