首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 集合類全攻略:字典、集合、數組排序與高效遍歷

     編輯:關於C語言

Objective-C 集合類全攻略:字典、集合、數組排序與高效遍歷

Foundation 框架提供的集合類(NSArray/NSDictionary/NSSet 及其可變對應類)是 iOS/macOS 開發的基石。本文系統整理不可變/可變字典、集合(含計數集合)、快速枚舉、數組排序(含數值排序陷阱)的核心 API、典型用法與性能考量。

一、字典(NSDictionary / NSMutableDictionary)

核心特徵

  • 鍵值對存儲,Key 唯一且需遵循 NSCopying 協議(通常用 NSString),Value 必須是對象。
  • 無序存儲,靠 Key 存取,平均 O(1)。
  • 不可變類創建後不可增刪改,可變類支持動態操作。

創建與基本操作

// 不可變字典 - 現代語法 @{key: value, ...}
NSDictionary *dict = @{
    @"name": @"ZhangSan",
    @"age": @18,
    @"sex": @"Man"
};

// 讀取
NSString *name = dict[@"name"]; // 現代下標語法,等同 objectForKey:
NSArray *allKeys = [dict allKeys];
NSArray *allValues = [dict allValues];

// 快速枚舉 - 遍歷 Key
for (NSString *key in dict) {
    NSLog(@"%@: %@", key, dict[key]);
}

// 可變字典
NSMutableDictionary *mDict = [NSMutableDictionary dictionary];
mDict[@"height"] = @"170cm"; // 新增/修改
[mDict removeObjectForKey:@"age"]; // 刪除
// 批量操作
[mDict addEntriesFromDictionary:anotherDict];

二、集合(NSSet / NSMutableSet / NSCountedSet)

核心特徵

  • 元素唯一、無序、必須是對象。
  • NSSet 不可變,NSMutableSet 可增刪,NSCountedSet 可統計重複次數(底層仍去重,但維護計數)。

典型操作

// 創建
NSSet *set = [NSSet setWithObjects:@"北京", @"上海", @"廣州", nil];
// 注意:重複元素會被自動去重

// 判斷包含
if ([set containsObject:@"北京"]) { ... }

// 遍歷
for (NSString *city in set) { ... }

// 可變集合操作
NSMutableSet *mSet = [set mutableCopy];
[mSet addObject:@"深圳"];
[mSet removeObject:@"上海"];
[mSet unionSet:anotherSet]; // 並集
[mSet intersectSet:anotherSet]; // 交集

// NSCountedSet - 統計詞頻
NSArray *words = @[@"apple", @"banana", @"apple", @"apple", @"orange"];
NSCountedSet *counted = [NSCountedSet setWithArray:words];
NSLog(@"apple count: %lu", (unsigned long)[counted countForObject:@"apple"]); // 3

三、快速枚舉統一語法

for (Type *obj in collection) { ... }
集合類型枚舉產出示例
NSArray元素對象for (id obj in array)
NSDictionaryKeyfor (id key in dict) -> dict[key]
NSSet元素對象for (id obj in set)

快速枚舉比傳統 for (int i=0; i 更安全(防止越界)、更快(內部使用指針迭代)、語法更簡潔。

四、數組排序

基本排序:compare: 選擇器

適用於元素實現 compare: 方法的對象(NSString、NSNumber、NSDate 等)。

// 可變數組原地排序
NSMutableArray *mArr = [@[@3, @1, @4, @2] mutableCopy];
[mArr sortUsingSelector:@selector(compare:)];
// 結果: 1, 2, 3, 4

// 不可變數組返回新排序數組
NSArray *sorted = [@[@4, @2, @1, @3] sortedArrayUsingSelector:@selector(compare:)];

自定義比較:Comparator Block

靈活控制升降序、多字段排序。

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    // 降序
    return [obj2 compare:obj1];
}];

數值排序陷阱與正確姿勢

錯誤示範:數組存放 NSString 形式的數字 @[@"10", @"2", @"1"] 直接用 compare: 會按字典序排序為 1, 10, 2。
正確做法:轉為 NSNumber 再排序,或使用 Block 比較 integerValue。

NSArray *stringNumbers = @[@"10", @"2", @"1", @"20"];
NSArray *correctSorted = [stringNumbers sortedArrayUsingComparator:^NSComparisonResult(NSString *s1, NSString *s2) {
    return @([s1 integerValue]).compare(@([s2 integerValue]));
}];
// 結果: 1, 2, 10, 20

// 或預先轉換為 NSNumber 數組
NSArray *numbers = [stringNumbers valueForKeyPath:@"@integerValue.self"]; // KVC 技巧
NSArray *sortedNumbers = [numbers sortedArrayUsingSelector:@selector(compare:)];

五、性能與選型建議

場景推薦類型理由
頻繁按索引隨機訪問、順序遍歷NSArray連續內存,O(1) 索引,緩存友好
頻繁增刪、不關心順序、需去重NSSet / NSMutableSet哈希表 O(1) 查找/插入/刪除
鍵值映射、配置表、JSON 解析NSDictionary / NSMutableDictionary哈希表 O(1) 存取
需統計元素出現次數NSCountedSet內建計數器

總結

  • 優先使用現代字面量語法 @[]、@{}、@() 創建集合,代碼更簡潔安全。
  • 不可變集合為默認選擇,需修改時再 mutableCopy,利於線程安全與優化。
  • 排序時確認元素類型實現 compare:,字符串數字務必轉 NSNumber。
  • 快速枚舉是遍歷首選,Block 回調排序提供最大靈活性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved