首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS開發技巧:NSMutableArray高效去重並保持順序的三種方案

     編輯:程式設計綜合問答

需求分析

給定一個`NSMutableArray`,要求移除重複元素並保持原有順序,返回新的有序數組。

方案一:NSSet去重(不保證順序)


// ⚠️ 無序,僅作參考
NSArray *uniqueArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];

方案二:NSOrderedSet(iOS 7+,推薦)


// 一行代碼搞定,自動保持首次出現順序
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

性能對比(10萬條數據測試)

方法耗時順序保持適用場景
NSOrderedSet~15ms✅iOS 7+ 通用首選
手動遍歷+Set~22ms✅需自定義比較邏輯
NSSet + 排序~35ms❌不關心順序

總結

現代iOS開發首選`NSOrderedSet`,一行代碼解決去重+保序。舊項目或特殊比較需求時,手動遍歷配合`NSMutableSet`是標準模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved