NSSet 是 Foundation 框架中的無序唯一集合,對應 Java 的 Set、Python 的 set。本文通過代碼演示其創建、去重特性、衍生新集合、子集/包含判斷等核心操作。
isEqual: 和 hash 去重NSMutableSet// 將 NSArray 或 NSSet 轉為可讀字符串
NSString *NSCollectionToString(id collection) {
NSMutableString *str = [NSMutableString stringWithString:@"["];
for (id obj in collection) {
[str appendString:[obj description]];
[str appendString:@", "];
}
// 移除末尾 ", "
NSUInteger len = [str length];
if (len > 1) [str deleteCharactersInRange:NSMakeRange(len - 2, 2)];
[str appendString:@"]"];
return str;
}
#import// 前置聲明輔助函數 NSString *NSCollectionToString(id collection); int main(int argc, const char *argv[]) { @autoreleasepool { // 1. 創建集合:重複元素 "B" 會自動去重 NSSet *set1 = [NSSet setWithObjects:@"A", @"B", @"C", @"B", nil]; NSLog(@"set1 count: %ld", [set1 count]); // 3 NSLog(@"set1: %@", NSCollectionToString(set1)); // [A, B, C] // 2. 不可變性驗證:setByAddingObject 返回新集合 NSSet *set2 = [set1 setByAddingObject:@"D"]; NSLog(@"set1 不變: %@", NSCollectionToString(set1)); // [A, B, C] NSLog(@"set2 新增: %@", NSCollectionToString(set2)); // [A, B, C, D] // 3. 子集判斷 BOOL isSubset = [set1 isSubsetOfSet:set2]; NSLog(@"set1 ⊆ set2: %d", isSubset); // 1 (YES) // 4. 包含判斷 BOOL hasC = [set1 containsObject:@"C"]; NSLog(@"set1 包含 C: %d", hasC); // 1 (YES) } return 0; }
2015-12-03 20:16:52.049 NSSetTest[5903:419290] set1 count: 3 2015-12-03 20:16:52.050 NSSetTest[5903:419290] set1: [A, B, C] 2015-12-03 20:16:52.050 NSSetTest[5903:419290] set1 不變: [A, B, C] 2015-12-03 20:16:52.051 NSSetTest[5903:419290] set2: [A, B, C, D] 2015-12-03 20:16:52.051 NSSetTest[5903:419290] set1 ⊆ set2: 1 2015-12-03 20:16:52.051 NSSetTest[5903:419290] set1 包含 C: 1 Program ended with exit code: 0
setWithObjects: 內部調用 isEqual: 比較對象。對於 NSString,比較內容而非指針,因此 @"B" 只保留一個。
setByAddingObject: 不修改原集合,返回新 NSSet 實例set1 完全不變,符合函數式編程風格isSubsetOfSet: 返回 YES——set1 確實是 set2 的子集| 操作 | Objective-C (NSSet) | Java (HashSet) |
|---|---|---|
| 創建 | [NSSet setWithObjects:...] | new HashSet<>(Arrays.asList(...)) |
| 添加元素 | [set setByAddingObject:obj] (返回新) | set.add(obj) (原地修改) |
| 判斷包含 | [set containsObject:obj] | set.contains(obj) |
| 子集判斷 | [set1 isSubsetOfSet:set2] | set2.containsAll(set1) |
| 遍歷 | for (id obj in set) | for (Object obj : set) |