iOS数组去重高效实现方法

更新时间:2025-04-14 分类:网络技术 浏览量:1

你的iOS数组里还塞满"双胞胎"数据吗?

刚接触iOS开发的新手们,是不是经常遇到这种情况:从网络请求回来的用户列表有重复账号?购物车里的商品条目莫名其妙出现两份?别慌!今天我们就来彻底解决这个让无数开发者抓狂的数组去重问题。

为什么数组会变成"复制工厂"?

先理解问题根源才能对症下药:
1. 网络请求重复提交导致服务端返回相同数据
2. 用户快速点击造成的重复添加操作
3. 多线程环境下数据同步不及时
4. 本地缓存机制设计缺陷

新手必学的三大去重绝招

准备好你的Xcode,我们直接上硬菜:

招式一:NSSet暴力去重法

这是最快捷的解决方案,适合基础数据类型:


// 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组合

还在为重复数据烦恼?赶紧把这些代码片段收藏到你的代码工具箱吧!实际开发中根据业务需求灵活选择,你会发现处理数组就像整理衣柜一样得心应手。