Object C学习笔记12-集合
Object C學習筆記12-集合
2014-03-08 17:25 by 賀臣, 262 閱讀, 0 評論, 收藏, 編輯
這里講到的集合是指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);} 集合NSMutableSet中添加元素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); 刪除NSMutableSet集合中的元素使用removeObject方法用于刪除NSMutableSet集合中的元素,在以上代碼中刪除一個值為2的NSNumber對象。
而使用removeAllObjects方法則用于刪除NSNutableSet中的所有的元素,最后一行代碼輸出的結果0。
(4)其他方法介紹
- (void)unionSet:(NSSet *)other;用于向集合中添加另外一個集合的所有元素
- (void)minusSet:(NSSet *)other;用于刪除other中包含的元素
Set集合與Array比較類似,更多方法可以查看官方API文檔。?
?
轉載于:http://www.cnblogs.com/qingyuan/p/3587342.html
轉載于:https://www.cnblogs.com/wodehao0808/p/3592130.html
總結
以上是生活随笔為你收集整理的Object C学习笔记12-集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 262K Color
- 下一篇: C#代码计时