這裡講到的集合是指Set集合,其實Array也是一種型別的集合。在Object C中提供了兩個集合類NSSet和NSMutableSet。其實NSSet和NSArray性質一樣,都是用於儲存物件的。
然而Array集合和Set集合還是有區別的,主要是在於Set集合的搜尋速度要比Array速度要快,NSArray和NSMutableArray 是一種有序集合,其儲存的值在記憶體中是連續的,而NSSet和NSMutableSet是無需集合,在記憶體中的儲存方式是不連續的,在NSSet,NSMutableSet採用了hash演算法,你懂的!
一. NSSet集合
剛才上面也簡單的介紹了一下NSSet集合,NSSet集合是一種無序集合,使用hash演算法來查詢儲存的值。通過hash演算法可以直接查詢到儲存的地址,而有序集合需要遍歷所有元素來查詢資料。
(1) 初始化NSSet集合
NSNumber *num=[NSNumber numberWithInteger:2345]; NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil];
因為NSSet集合只能儲存物件型別,如果要儲存int,char,double 等基礎型別,必須將這些轉化為物件型別才能儲存到NSSet集合中。第一行程式碼將數字轉化為NSNumber數字物件。
使用setWithObjects 來初始化一個NSSet集合,同樣和NSArray一樣,需要使用nil來標識集合的結束。
(2) 使用count獲取NSSet集合的長度
NSNumber *num=[NSNumber numberWithInteger:2345]; NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil]; NSLog(@"%d",[set count]);
上面的程式碼輸出結果為3,說明集合set中包含三個元素,注意最後的nil不包含在其中。同時NSSet可以同時儲存不同型別的物件,上面的程式碼中就包含了NSString和NSNumber兩種型別物件。
(3) 使用containObject判斷是否包含某個元素
NSNumber *num1=[NSNumber numberWithInteger:23]; bool flag=[set containsObject:num1]; NSLog(@"%i",flag);
這段程式碼中重新宣告瞭一個物件num1,containObject方法用於判斷NSSet中是否包含特定的物件,返回值為bool。如果使用如上程式碼則則返回為NO,輸出為0
(4) 使用objectEnumerator將集合轉化為迭代器
NSEnumerator *enumr=[set objectEnumerator]; NSObject *item=[enumr nextObject]; while(item!=nil){ NSLog(@"%@",item); item=[enumr nextObject]; } for(NSObject *obj in set){ NSLog(@"%@",obj); }
使用set呼叫objectEnumerator方法只會,就將集合轉化為NSEnumerator類,而NSEnumerator類有一個很重要的方法nextObject,用於獲取迭代器的下一個元素。直到迭代到最後一個元素。
(5) 元素的比較
//比較兩個集合 NSSet *setItems1=[NSSet setWithObjects:@"123", @"234", @"456",nil]; NSSet *setItem2=[NSSet setWithObjects:@"123",@"234", nil]; NSSet *setItem3=[NSSet setWithObjects:@"123",@"234", @"456",nil]; bool flag1=[setItems1 isEqualToSet:setItem2]; bool flag2=[setItems1 isEqualToSet:setItem3]; NSLog(@"flag1=%i",flag1); NSLog(@"flag2=%i",flag2); bool flag3=[setItem2 isSubsetOfSet:setItems1]; NSLog(@"flag3=%i",flag3); bool flag5=[setItems1 isSubsetOfSet:setItem2]; NSLog(@"flag5=%i",flag5); bool flag4=[setItem2 intersectsSet:setItem3]; NSLog(@"flag4=%i",flag4);
使用方法isEqualToSet用於判斷兩個集合元素是否一樣,返回bool值。
- (BOOL)isSubsetOfSet:(NSSet *)otherSet; 判斷前者集合是不是後者的子集。在上面的例子中可以看到兩個集合呼叫的主從關係,這裡是有區別的。
- (BOOL)intersectsSet:(NSSet *)otherSet;判斷兩個集合是否有交集,也就是兩個集合是否有相同的元素。
二. NSMutableSet動態集合
NSMutableSet和之前的NSMutableArray陣列一樣,是可以動態新增和刪除元素的。NSMutableSet是NSSet的一個子類。
(1) setWithCapacity用於初始化NSMutableSet的容量,這裡要注意容量並不等於儲存的元素數量
NSMutableSet *muSet=[NSMutableSet setWithCapacity:10];
以上程式碼就是初始化了一個容量為10的NSMutableSet集合,當往NSMutableSet中新增新的元素物件時候,如果數量超過10不會陣列越界,因為NSMutableSet是當儲存滿之後容量自動擴充。
(2) 往集合中新增物件元素
NSMutableSet *muSet=[NSMutableSet setWithCapacity:10]; NSNumber *number1=[NSNumber numberWithInteger:344]; NSNumber *number2=[NSNumber numberWithInt:34]; NSNumber *number3=[NSNumber numberWithInt:545]; [muSet addObject:number1]; [muSet addObject:number2]; [muSet addObject:number3]; NSArray *nsArray=[NSArray arrayWithObjects: [NSNumber numberWithInt:2],[NSNumber numberWithInt:3],[NSNumber numberWithInt:4], nil]; [muSet addObjectsFromArray:nsArray]; for(NSNumber *item in muSet){ NSLog(@"^^^^^^%d",item); }
addObject 方法用於往NSMutableSet集合中新增元素,每次只能新增一個元素。
而addObjectsFromArray方法則用於將一個陣列新增到NSMutableSet集合中
(3) 刪除集合中的元素
[muSet removeObject:[NSNumber numberWithInt:2]]; for(NSNumber *item in muSet){ NSLog(@"-----^%d",item); } [muSet removeAllObjects]; int leng=[muSet count]; NSLog(@"00000-%d",leng);
使用removeObject方法用於刪除NSMutableSet集合中的元素,在以上程式碼中刪除一個值為2的NSNumber物件。
而使用removeAllObjects方法則用於刪除NSNutableSet中的所有的元素,最後一行程式碼輸出的結果0。
(4)其他方法介紹
- (void)unionSet:(NSSet *)other;用於向集合中新增另外一個集合的所有元素
- (void)minusSet:(NSSet *)other;用於刪除other中包含的元素
Set集合與Array比較類似,更多方法可以檢視官方API文件。