給定一個`NSMutableArray`,要求移除重複元素並保持原有順序,返回新的有序數組。
// ⚠️ 無序,僅作參考
NSArray *uniqueArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
// 一行代碼搞定,自動保持首次出現順序
NSArray *uniqueArray = [[NSOrderedSet orderedSetWithArray:array] array];
- (NSArray *)uniqueArrayKeepingOrder:(NSArray *)source {
NSMutableArray *result = [NSMutableArray array];
NSMutableSet *seen = [NSMutableSet set];
for (id obj in source) {
if (![seen containsObject:obj]) {
[seen addObject:obj];
[result addObject:obj];
}
}
return result;
}
若數組元素為自定義模型,需實現`isEqual:`與`hash`方法:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation Person
- (BOOL)isEqual:(id)object {
if (![object isKindOfClass:[Person class]]) return NO;
Person *other = (Person *)object;
return [self.name isEqualToString:other.name] && self.age == other.age;
}
- (NSUInteger)hash {
return self.name.hash ^ self.age;
}
@end
| 方法 | 耗時 | 順序保持 | 適用場景 |
|---|---|---|---|
| NSOrderedSet | ~15ms | ✅ | iOS 7+ 通用首選 |
| 手動遍歷+Set | ~22ms | ✅ | 需自定義比較邏輯 |
| NSSet + 排序 | ~35ms | ❌ | 不關心順序 |
現代iOS開發首選`NSOrderedSet`,一行代碼解決去重+保序。舊項目或特殊比較需求時,手動遍歷配合`NSMutableSet`是標準模式。