給定兩個陣列:first = [1,2,3,4,5,6]、second = [2,4,6,8,0,12]。期望合併後保持首次出現順序並去重,結果為 [1,2,3,4,5,6,8,0,12]。
NSOrderedSet / NSMutableOrderedSet 同時保證「有序」與「唯一」,完美契合此場景:
NSMutableOrderedSet *firstSet = [NSMutableOrderedSet orderedSetWithArray:@[@1, @2, @3, @4, @5, @6]];
NSOrderedSet *secondSet = [NSOrderedSet orderedSetWithArray:@[@2, @4, @6, @8, @0, @12]];
[firstSet unionOrderedSet:secondSet]; // 就地合併,保持 first 順序,補充 second 中不重複元素
NSArray *result = [firstSet array]; // 轉回 NSArray
NSLog(@"%@", result); // (1, 2, 3, 4, 5, 6, 8, 0, 12)
| 方法 | 有序 | 唯一 | 複雜度 | 適用場景 |
|---|---|---|---|---|
| NSMutableOrderedSet | ✅ | ✅ | O(n) | 首選,語義清晰 |
| NSSet + 排序 | ❌ | ✅ | O(n log n) | 不需保持順序 |
| 遍歷檢查 containsObject | ✅ | ✅ | O(n²) | 極小數據量 |
| NSDictionary 以值為鍵 | ❌ | ✅ | O(n) | 需快速查找 |
var first = [1, 2, 3, 4, 5, 6]
let second = [2, 4, 6, 8, 0, 12]
var seen = Set(first)
for num in second where !seen.contains(num) {
first.append(num)
seen.insert(num)
}
// first = [1, 2, 3, 4, 5, 6, 8, 0, 12]
Objective-C 直接使用 NSMutableOrderedSet.unionOrderedSet: 一行解決,既高效又語義明確;Swift 則用 Set 輔助去重並保持順序。避免手寫雙重循環,提升代碼可讀性與效能。