Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
刚接触iOS开发的新手们,是不是经常遇到这种情况:从网络请求回来的用户列表有重复账号?购物车里的商品条目莫名其妙出现两份?别慌!今天我们就来彻底解决这个让无数开发者抓狂的数组去重问题。
先理解问题根源才能对症下药:
1. 网络请求重复提交导致服务端返回相同数据
2. 用户快速点击造成的重复添加操作
3. 多线程环境下数据同步不及时
4. 本地缓存机制设计缺陷
准备好你的Xcode,我们直接上硬菜:
这是最快捷的解决方案,适合基础数据类型:
// Objective-C版本
NSArray *originArray = @[@1, @2, @2, @3];
NSSet *uniqueSet = [NSSet setWithArray:originArray];
NSArray *resultArray = [uniqueSet allObjects];
// Swift版本
let originArray = [1, 2, 2, 3]
let uniqueArray = Array(Set(originArray))
⚠️ 注意:这种方法会丢失原始顺序,适合不关心排列顺序的场景
保留原始顺序的经典做法:
NSMutableArray *uniqueArray = [NSMutableArray array];
for (id obj in originArray) {
if (![uniqueArray containsObject:obj]) {
[uniqueArray addObject:obj];
}
}
✅ 优点:代码逻辑清晰易懂
❌ 缺点:时间复杂度O(n²),数据量大时性能堪忧
结合排序的去重妙招:
NSArray *sortedArray = [originArray sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *uniqueArray = [NSMutableArray array];
id previousObject = nil;
for (id currentObject in sortedArray) {
if (![currentObject isEqual:previousObject]) {
[uniqueArray addObject:currentObject];
previousObject = currentObject;
}
}
当数组元素是自定义对象时,需要特殊处理:
// 假设User对象有userId属性
NSArray *users = /*...*/;
NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
for (User *user in users) {
tempDict[user.userId] = user;
}
NSArray *uniqueUsers = [tempDict allValues];
1. 万级数据量推荐使用NSOrderedSet
2. 需要保持顺序时优先考虑字典法
3. 频繁操作建议封装成NSArray分类
4. Swift项目可以活用filter+contains组合
还在为重复数据烦恼?赶紧把这些代码片段收藏到你的代码工具箱吧!实际开发中根据业务需求灵活选择,你会发现处理数组就像整理衣柜一样得心应手。