iOS學習16之OC集合遍歷和陣列排序

2022-03-30 15:32:13 字數 4874 閱讀 6188

集合(collection):oc中提供的容器類:陣列,字典,集合。

遍歷:對集合中元素依次取出的過稱叫做遍歷。

三種方式:① for迴圈遍歷; ② nsenumerator遍歷; ③ for...in遍歷

原理:通過for迴圈的迴圈變數用作陣列元素下標來獲取不同下標的元素。

迴圈次數就是陣列元素的個數。

1

//陣列

2for (int i = 0; i < arr.count; i++)

原理:先獲取字典中所有的key,儲存到陣列中,遍歷陣列依次取出每乙個key,然後根據key從字典中取出對應的value

迴圈次數就是字典元素的個數。

1

//字典2//

獲取字典中所有的key值

3 nsarray *allkey =[dict allkeys];4//

遍歷key值陣列,訪問對應的object值

5for (int i = 0; i < allkey.count; i++)

原理:用集合的allobjects屬性先取到集合的所有元素儲存到陣列中,再通過for迴圈的迴圈變數用作下標來取到每個元素。

1

//集合2//

取出集合中的所有元素放到陣列中

3 nsarray *setarray = [set

allobjects];

4for (int i = 0; i < setarray.count; i++)

列舉器,遍歷集合中的元素。

依附於集合類(nsarray,nsset,nsdictionary),沒有用來建立例項的介面。

nsenumerator的 nextobject 方法可以遍歷每個集合元素,結束返回 nil ,通過與 while 結合使用可遍歷集合中所有元素。

對可變集合(陣列,字典,集合

)進行列舉操作時,不能通過新增或刪除物件這類方式來改變集合容器的元素個數。

正序(objectenumerator)

1

//陣列(正序)2//

建立正序的列舉器物件

3 nsenumerator *arrayenum1 =[arr objectenumerator];

4id value1 =nil;5//

判斷value部位空列印資料

6while ((value1 =[arrayenum1 nextobject]))

倒序(reverseobjectenumerator)

1

//陣列(倒序)2//

建立倒序的列舉器物件

3 nsenumerator *arrayenum2 =[arr reverseobjectenumerator];

4id value2 =nil;

5while ((value2 =[arrayenum2 nextobject]))

注:列舉器的nextobject方法只能取出乙個物件,所以需要和while迴圈結合把所有元素依次取出。

③ 字典遍歷

1

//字典2//

遍歷到的是字典中的value值

3 nsenumerator *dictenum =[dict objectenumerator];

4id value3 =nil;

5while ((value3 =[dictenum nextobject]))

注:字典中存放的資料是無序的,沒有反向列舉的概念。

④ 集合遍歷

1

//集合

2 nsenumerator *setenum = [set

objectenumerator];

3id value4 =nil;

4while ((value4 =[setenum nextobject]))

注:集合中存放的資料是無序的,沒有反向列舉的概念。

for...in:快速列舉,是在nsenumerator的基礎上封裝的更加方便的快速的遍歷集合元素的方式。

格式:for (集合中物件的型別 * 元素名 in

被遍歷的集合)

對可變集合(陣列,字典,集合

)進行快速列舉操作時,不能通過新增或刪除物件這類方式來改變集合容器的元素個數。

② 陣列遍歷

1

//陣列

2for (id value in

arr)

③ 字典遍歷

1

//字典 遍歷的是字典的key

2for (id value in

dict)

④ 集合遍歷

1

//集合

2for (id value in

set)

陣列是有序容器,因此集合中只有陣列才能排序。

該類能夠方便的實現對陣列中的物件進行公升序或者降序的排序。

它可以把元素的某個屬性作為key進行公升序或降序的排序,每個nssortdescriptor物件就是乙個排序條件。

初始化方法

- (instancetype)initwithkey:(nsstring *)key ascending:(bool)ascending;

key:按照陣列中物件的哪個屬性進行排序,如果陣列中存放的是能夠直接排序的物件(比如:字串),直接使 @"self" 或者 nil 即可;如果存放的是自定義類的物件,使用想要進行排序的屬性名即可(比如:想按照person類的name進行排序, 使用 @"name" 作為引數)。

ascending:排序的標誌,是公升序還是降序。 yes - 公升序, no -

降序。nssortdescriptor建立

1 nssortdescriptor *sortdes1 = [[nssortdescriptor alloc] initwithkey:@"self" ascending:yes]; //公升序

2 nssortdescriptor *sortdes2 = [[nssortdescriptor alloc] initwithkey:@"name" ascending:no]; //降序

排序

1

//基本資料型別不可變陣列

2 array =[array sortedarrayusingdescriptors:@[sortdes1]];

3 nslog(@"%@"

, array);4//

自定義物件不可變陣列5//

按照名字排序

6 personarray =[personarray sortedarrayusingdescriptors:@[sortdes2]];

7 nslog(@"

%@", personarray);

② 可變陣列

排序

1

//基本型別可變陣列

2[marray sortusingdescriptors:@[sortdes1]];

3 nslog(@"%@"

, marray);4//

自定義物件可變陣列5//

按照名字排序

6[personmarray sortusingdescriptors:@[sortdes2]];

7 nslog(@"

%@", personmarray);

- (nsarray *)sortedarrayusingselector:(sel)comparator;

注:sel型別的引數comparator:需要傳入乙個返回結果是nscomparisonresult的方法名。

1

//不可變陣列(基本資料型別)

2 array =[array sortedarrayusingselector:@selector(compare:)];

3 nslog(@"%@"

, array);4//

不可變的陣列(自定義型別的物件)5//

按照名字排序

6 personarray = [personarray sortedarrayusingselector:@selector(comparebyname:)]; //

comparebyname為person類中自定義的方法

7 nslog(@"

%@", personarray);

- (void)sortusingselector:(sel)comparator;

注:sel型別的引數comparator:需要傳入乙個返回結果是nscomparisionresult的函式

1

//可變陣列(基本資料型別)

2[marray sortusingselector:@selector(compare:)];

3 nslog(@"%@"

, marray);4//

可變的陣列(自定義型別的物件)5//

按照名字排序

6[personmarray sortusingselector:@selector(comparebyname:)];

7 nslog(@"

%@", personmarray);

person類中comparebyname方法:

1

//比較方法的宣告

2 - (nscomparisonresult)comparebyname:(person *)anotherperson;3//

比較方法的實現

4 - (nscomparisonresult)comparebyname:(person *)anotherperson

iOSDay16之OC集合遍歷和陣列排序

1 集合遍歷集合 collection oc中提供的容器類 陣列,字典,集合。遍歷 對集合中元素依次取出的過稱叫做遍歷。三種方式 for迴圈遍歷 nsenumerator遍歷 for.in遍歷 原理 通過for迴圈的迴圈變數用作陣列元素下標來獲取不同下標的元素。迴圈次數就是陣列元素的個數。1 陣列 ...

ios 學習之OC語言總結2

這裡總結自己了解的 協議 通知廣播,block語句 沒和之前總結的一起,這裡自己理解起來也花了點時間 ios 中 protocol 委託的理解 ui 兩個view檢視的資料傳遞 意義 委託給其他人做事 h 在需要把資料傳遞出去的view進行協議的定義 比如 1 protocol 進行定義 2 寫入要...

IOS學習之OC物件導向 封裝

一 物件導向和封裝 物件導向的三大特性 封裝 成員變數 繼承和多型 在oc語言中,使用 inte ce 和 implementation 來處理類。inte ce就好像暴露在外面的時鐘表面,像外界提供展示以及介面。implementation就好像隱藏在時鐘內部的構造實現,把具體的實現封裝了起來。二...