Objective-C 下用 NSArray 和 NSMutableArray 定義二維數組跟多維數

來源:互聯網
上載者:User

標籤:http   java   使用   os   io   檔案   for   ar   

Objective-C 下用 NSArray 和 NSMutableArray 定義二維數組跟多維陣列 目錄
  • 問題描述
  • Objective-C 中的數組對像 NSArray 和 NSMutableArray 簡介
  • 二維數組:嵌套兩次的 NSMutableArray
  • 多維陣列:嵌套多次的 NSMutableArray
問題描述

說實話,不太習慣物件導向編程,所以在操作 Objective-C 中數組對象時,總是忍不住跟 C 中的數組做比較,正好要建立一個二維數組,需要根據二維數組的下標來做相應的設定,恰好又是第一次使用數組對像,各種不熟悉、不適應。。。多麼懷念形如 array[0][1] 的文法形式啊,可惜的是,NSArrayNSMutableArray 不能這麼搞,於是查了半天資料,又寫了幾個驗證用的小程式,終於明白如何做了,下面詳細介紹。

Objective-C 中的數組對像 NSArray 和 NSMutableArray 簡介

Objective-C 提供了兩種數組對像,一種是不可變數組 NSArray,一種是可變數組 NSMutableArray

首先要清楚 C 中的 數組Objective-C 中的 數組對像 的使用差異,前者可以通過賦值 = 來設定一個數組中某個元素的值,如:

int array[0] = 12;

後者則必須通過類中提供的的方法來實現,不能通過 = 賦值的方式來操作,在 Objective-C 中我們使用 Foundation 架構,它為 NSArrayNSMutableArray 提供了多種設定數組元素的方法。

我們這裡討論可變數組 NSMutableArray,它使用 addObject 方法來增加數組元素,假設我們要定義一個包含4個元素的可變數組,分別賦值為“1、2、3、4”,實現代碼 myTestArray.m 如下:

#import<Foundation/Foundation.h>int main(int argc, const char *argv[]){  @autoreleasepool  {    // 初始化數組    NSMutableArray *myArray = [[NSMutableArray alloc]initWithCapacity:4];     // 依次增加數組元素    [myArray addObject:@"1"];    [myArray addObject:@"2"];    [myArray addObject:@"3"];    [myArray addObject:@"4"];    // 列印數組 myArray 的內容    NSLog(@"%@", myArray);  }  return 0;}

把上述代碼儲存為 myTestArray.m,然後在終端視窗執行如下命令來編譯:

gcc -framework Foundation -o myTestArray myTestArray.m

產生可執行檔 myTestArray,運行結果如下:

Air:gcc-code admin$ ./myTestArray 2014-08-16 22:26:17.794 myTestArray[75966:507] (    1,    2,    3,    4)Air:gcc-code admin$
二維數組:嵌套兩次的 NSMutableArray

Objective-C 中,沒有直觀的二維數組,不過我們回憶一下 C 中的二維數組,就會發現其實所謂的二維數組不過是兩個一維數組的嵌套,以一維數組作為數組的元素。

理解了這一點,那麼構造我們的二維數組對象就簡單了,示範程式 myD2Array.m 如下代碼:

#import<Foundation/Foundation.h>int main(int argc, const char *argv[]){  @autoreleasepool  {    // 初始化作為列的數組,它有4個元素,我們可以把它看做4列    NSMutableArray *myColumnArray = [[NSMutableArray alloc]initWithCapacity:4];    // 初始化4個一維數組,每個一維數組有4個元素,我們可以把它看做1行4列,4行加起來就是4行4列    NSMutableArray *myRowArray1 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray2 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray3 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray4 = [[NSMutableArray alloc]initWithCapacity:4];     // 每個行依次增加數組元素    // 第一行    [myRowArray1 addObject:@"11"];    [myRowArray1 addObject:@"12"];    [myRowArray1 addObject:@"13"];    [myRowArray1 addObject:@"14"];    // 第二行    [myRowArray2 addObject:@"21"];    [myRowArray2 addObject:@"22"];    [myRowArray2 addObject:@"23"];    [myRowArray2 addObject:@"24"];    // 第三行    [myRowArray3 addObject:@"31"];    [myRowArray3 addObject:@"32"];    [myRowArray3 addObject:@"33"];    [myRowArray3 addObject:@"34"];    // 第四行    [myRowArray4 addObject:@"41"];    [myRowArray4 addObject:@"42"];    [myRowArray4 addObject:@"43"];    [myRowArray4 addObject:@"44"];    // 以這4個一維數組作為列數組的元素,依次加入    [myColumnArray addObject:myRowArray1];    [myColumnArray addObject:myRowArray2];    [myColumnArray addObject:myRowArray3];    [myColumnArray addObject:myRowArray4];    // 分別列印數組 myRowArray1~2 和 myColumnArray 的內容    NSLog(@"myRowArray1: %@", myRowArray1);    NSLog(@"myRowArray2: %@", myRowArray2);    NSLog(@"myColumnArray: %@", myColumnArray);  }  return 0;}

把上述代碼儲存為 myD2Array.m,然後在終端視窗執行如下命令來編譯:

gcc -framework Foundation -o myD2Array myD2Array.m

產生可執行檔 myD2Array,運行結果如下:

Air:gcc-code admin$ ./myD2Array 2014-08-16 23:12:14.471 myD2Array[76792:507] myRowArray1: (    11,    12,    13,    14)2014-08-16 23:12:14.474 myD2Array[76792:507] myRowArray2: (    21,    22,    23,    24)2014-08-16 23:12:14.474 myD2Array[76792:507] myColumnArray: (        (        11,        12,        13,        14    ),        (        21,        22,        23,        24    ),        (        31,        32,        33,        34    ),        (        41,        42,        43,        44    ))Air:gcc-code admin$

很好,上述代碼建立了一個 Objective-C 下使用 Cocoa 的二維數組,那麼如何訪問這個二維數組中的元素呢?是否可以通過下標的方式來引用?我們可以使用方法 objectAtIndex 來擷取數組中的元素,比如想擷取數組 myRowArray1 中的元素,可以使用如下的代碼 [myRowArray1 objectAtIndex:列下標]

[myRowArray1 objectAtIndex:0][myRowArray1 objectAtIndex:1][myRowArray1 objectAtIndex:2][myRowArray1 objectAtIndex:3]

如果想擷取 myColumnArray 中的元素,可以使用如下代碼 [myColumnArray objectAtIndex:行下標]

[myColumnArray objectAtIndex:0][myColumnArray objectAtIndex:1][myColumnArray objectAtIndex:2][myColumnArray objectAtIndex:3]

把上述代碼實際跑一遍,就會發現我們真正需要的是把 行下標列下標 組合起來使用,因為這樣才能準確定位到最終的元素,而不是一個數組形式的元素,那麼就是如下形式:

[[myColumnArray objectAtIndex:行下標] objectAtIndex:列下標];

這樣的形式跟 C 程式中的 array[行下標][列下標] 形式也比較類似,理解起來也容易,最終的示範代碼 myD2-2TestArray.m 如下:

#import<Foundation/Foundation.h>int main(int argc, const char *argv[]){  @autoreleasepool  {    // 初始化作為列的數組,它有4個元素,我們可以把它看做4列    NSMutableArray *myColumnArray = [[NSMutableArray alloc]initWithCapacity:4];    // 初始化4個一維數組,每個一維數組有4個元素,我們可以把它看做1行4列,4行加起來就是4行4列    NSMutableArray *myRowArray1 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray2 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray3 = [[NSMutableArray alloc]initWithCapacity:4];    NSMutableArray *myRowArray4 = [[NSMutableArray alloc]initWithCapacity:4];     // 每個行依次增加數組元素    // 第一行    [myRowArray1 addObject:@"11"];    [myRowArray1 addObject:@"12"];    [myRowArray1 addObject:@"13"];    [myRowArray1 addObject:@"14"];    // 第二行    [myRowArray2 addObject:@"21"];    [myRowArray2 addObject:@"22"];    [myRowArray2 addObject:@"23"];    [myRowArray2 addObject:@"24"];    // 第三行    [myRowArray3 addObject:@"31"];    [myRowArray3 addObject:@"32"];    [myRowArray3 addObject:@"33"];    [myRowArray3 addObject:@"34"];    // 第四行    [myRowArray4 addObject:@"41"];    [myRowArray4 addObject:@"42"];    [myRowArray4 addObject:@"43"];    [myRowArray4 addObject:@"44"];    // 以這4個一維數組作為列數組的元素,依次加入    [myColumnArray addObject:myRowArray1];    [myColumnArray addObject:myRowArray2];    [myColumnArray addObject:myRowArray3];    [myColumnArray addObject:myRowArray4];    // 按照行下標和列下標迴圈列印數組中的元素    int row;    int column;    // 按行下標迴圈列印數組 myRowArray1 中的元素    for(row=0;row<4;row++)    {                   NSLog(@"myRowArray1 行下標列印 : %@", [myRowArray1 objectAtIndex:row]);    }    // 按行下標迴圈列印數組 myColumnArray 中的元素--元素為一維數組    for(row=0;row<4;row++)    {                           NSLog(@"myColumnArray 行下標列印 : %@", [myColumnArray objectAtIndex:row]);    }    // 按行下標~列下標迴圈列印數組 myColumnArray 中的元素    for(row=0;row<4;row++)    {        for(column=0;column<4;column++)        {                           NSLog(@"myColumnArray 行下標+列下標列印: %@", [[myColumnArray objectAtIndex:row] objectAtIndex:column]);        }    }  }  return 0;}

編譯命令同上:

gcc -framework Foundation -o myD2-2Array myD2-2Array.m

執行結果如下:

Air:gcc-code admin$ ./myD2-2Array 2014-08-16 23:58:57.361 myD2-2Array[77579:507] myRowArray1 行下標列印 : 112014-08-16 23:58:57.364 myD2-2Array[77579:507] myRowArray1 行下標列印 : 122014-08-16 23:58:57.365 myD2-2Array[77579:507] myRowArray1 行下標列印 : 132014-08-16 23:58:57.365 myD2-2Array[77579:507] myRowArray1 行下標列印 : 142014-08-16 23:58:57.366 myD2-2Array[77579:507] myColumnArray 行下標列印 : (    11,    12,    13,    14)2014-08-16 23:58:57.366 myD2-2Array[77579:507] myColumnArray 行下標列印 : (    21,    22,    23,    24)2014-08-16 23:58:57.366 myD2-2Array[77579:507] myColumnArray 行下標列印 : (    31,    32,    33,    34)2014-08-16 23:58:57.367 myD2-2Array[77579:507] myColumnArray 行下標列印 : (    41,    42,    43,    44)2014-08-16 23:58:57.367 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 112014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 122014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 132014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 142014-08-16 23:58:57.369 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 212014-08-16 23:58:57.369 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 222014-08-16 23:58:57.370 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 232014-08-16 23:58:57.370 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 242014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 312014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 322014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 332014-08-16 23:58:57.372 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 342014-08-16 23:58:57.372 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 412014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 422014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 432014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標列印: 44Air:gcc-code admin$
多維陣列:嵌套多次的 NSMutableArray

理解了上面的二維數組,自己用 NSMutableArray 構造多維陣列就很簡單了,因為原理是相同的,只要再定義一個數組如 myDepthArray,把二維數組 myColumnArray 作為它的元素就可以了,只是寫起來比較繁瑣,在此就不詳述了。

另外本文主要採用 NSMutableArray 為例做了說明,其實用 NSArray 實現二維數組和多維陣列也很類似,感興趣的朋友可以自己試著寫寫。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.