iOS學習16之OC集合遍歷和數組排序


1、集合遍歷

 1> 遍歷

  集合(Collection):OC中提供的容器類:數組字典集合

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

  三種方式:① for循環遍歷; ② NSEnumerator遍歷; ③ for...in遍歷

 2> for循環遍歷

  ① 數組遍歷

   原理:通過for循環的循環變量用作數組元素下標來獲取不同下標的元素。

   循環次數就是數組元素的個數。

1 // 數組
2 for (int i = 0; i < arr.count; i++) {
3     NSLog(@"%@", arr[i]);
4 }

  ② 字典遍歷

   原理:先獲取字典中所有的key,存儲到數組中,遍歷數組依次取出每一個key,然后根據key從字典中取出對應的value

   循環次數就是字典元素的個數。

1         // 字典
2         // 獲取字典中所有的key值
3         NSArray *allKey = [dict allKeys];
4         // 遍歷key值數組,訪問對應的object值
5         for (int i = 0; i < allKey.count; i++) {
6             NSString *key = allKey[i];
7             NSLog(@"%@", [dict objectForKey:key]);
8         }

  ③ 集合遍歷

   原理:用集合的allObjects屬性先取到集合的所有元素存儲到數組中,再通過for循環的循環變量用作下標來取到每個元素。

1         // 集合
2         // 取出集合中的所有元素放到數組中
3         NSArray *setArray = [set allObjects];
4         for (int i = 0; i < setArray.count; i++) {
5             NSLog(@"%@", setArray[i]);
6         }

 3> NSEnumerator

  ① 概述 

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

   依附於集合類(NSArray,NSSet,NSDictionary),沒有用來創建實例的接口

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

   對可變集合(數組,字典,集合)進行枚舉操作時,不能通過添加或刪除對象這類方式來改變集合容器的元素個數

  ② 數組遍歷

   正序(objectEnumerator)

1         // 數組(正序)
2         // 創建正序的枚舉器對象
3         NSEnumerator *arrayEnum1 = [arr objectEnumerator];
4         id value1 = nil;
5         // 判斷value部位空打印數據
6         while ((value1 = [arrayEnum1 nextObject])) {
7             NSLog(@"%@", value1);
8         }    

   倒序(reverseObjectEnumerator)

1         // 數組(倒序)
2         // 創建倒序的枚舉器對象
3         NSEnumerator *arrayEnum2 = [arr reverseObjectEnumerator];
4         id value2 = nil;
5         while ((value2 = [arrayEnum2 nextObject])) {
6             NSLog(@"%@", value2);
7         }

  注:枚舉器的nextObject方法只能取出一個對象,所以需要和while循環結合把所有元素依次取出

  ③ 字典遍歷

1         // 字典
2         // 遍歷到的是字典中的value值
3         NSEnumerator *dictEnum = [dict objectEnumerator];
4         id value3 = nil;
5         while ((value3 = [dictEnum nextObject])) {
6             NSLog(@"%@", value3);
7         }

  注:字典中存放的數據是無序的沒有反向枚舉的概念

  ④ 集合遍歷

1         // 集合
2         NSEnumerator *setEnum = [set objectEnumerator];
3         id value4 = nil;
4         while ((value4 = [setEnum nextObject])) {
5             NSLog(@"%@", value4);
6         }

  注:集合中存放的數據是無序的,沒有反向枚舉的概念

 4> for...in 遍歷

  ① 概述

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

   格式:for (集合中對象的類型 * 元素名 in 被遍歷的集合) {

      語句;

       }

   對可變集合(數組,字典,集合)進行快速枚舉操作時,不能通過添加刪除對象這類方式來改變集合容器的元素個數

  ② 數組遍歷

1         // 數組
2         for (id value in arr) {
3             NSLog(@"%@", value);
4         }

  ③ 字典遍歷

1         // 字典 遍歷的是字典的key
2         for (id value in dict) {
3             NSLog(@"%@", dict[value]);
4         }

  ④ 集合遍歷

1         // 集合
2         for (id value in set) {
3             NSLog(@"%@", value);
4         }

2、數組排序

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

 1> NSSortDescriptor(排序描述符)概述

  該類能夠方便的實現對數組中的對象進行升序或者降序的排序。

  它可以把元素的某個屬性作為key進行升序降序的排序,每個NSSortDescriptor對象就是一個排序條件

 2> 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);

 3> 使用數組中 兩個元素比較的方法名 進行排序

  ① 不可變數組排序:(排序結果生成新數組, 原數組無改變)

   - (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 {
5          return [self.name compare:anotherPerson.name];
6          }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM