Object C學習筆記12 集合

2021-10-25 03:14:34 字數 4218 閱讀 5778

這裡講到的集合是指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)

for(nsobject *obj in set)

使用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

- (bool)intersectsset:(

nsset

二. 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)

addobject 方法用於往nsmutableset集合中新增元素,每次只能新增乙個元素。

而addobjectsfromarray方法則用於將乙個陣列新增到nsmutableset集合中

(3) 刪除集合中的元素

[muset removeobject:[nsnumber numberwithint:2

]];for(nsnumber *item in

muset)

[muset removeallobjects];

int leng=[muset count];

nslog(

@"00000-%d

",leng);

使用removeobject方法用於刪除nsmutableset集合中的元素,在以上**中刪除乙個值為2的nsnumber物件。

而使用removeallobjects方法則用於刪除nsnutableset中的所有的元素,最後一行**輸出的結果0。

(4)其他方法介紹

- (void)unionset:(

nsset

- (void)minusset:(

nsset

set集合與array比較類似,更多方法可以檢視官方api文件。 

Python學習筆記 七 集合

集合 set 是乙個無序的不重複元素序列。建立格式 parame 或者set value print basket 這裡演示的是去重功能 orange in basket 快速判斷元素是否在集合內 true crabgrass in basket false 下面展示兩個集合間的運算.a set a...

Python學習筆記(26)集合

學習主題 集合 學習日期 2020 02 08 python 版本 3.7.4 好了,那就按照這個路子開始吧 1.集合的定義 集合,列表,元組的對比。num type num class set 說明這是乙個集合 num 1 2,3 type num class list 說明這是乙個列表 num ...

Python學習筆記 10 集合

集合 set。1 天生可以去重。2 集合是無序的,沒有下標可取值。l 1,1,2,2,3,3 res set l print res 執行結果。集合和字典一樣用大括號。但是字典有冒號,k和v。集合沒有。l list res 去重後在轉回list jihe set 定義乙個空的集合 xingneng ...