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

Objective-C 下用 NSArray 和 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個元素的可變數組,分別賦值爲「一、二、三、4」,實現代碼 myTestArray.m 以下:code

#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,運行結果以下:ci

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 中的二維數組,就會發現其實所謂的二維數組不過是兩個一維數組的嵌套,以一維數組做爲數組的元素。it

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

#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 行下標打印 : 11
2014-08-16 23:58:57.364 myD2-2Array[77579:507] myRowArray1 行下標打印 : 12
2014-08-16 23:58:57.365 myD2-2Array[77579:507] myRowArray1 行下標打印 : 13
2014-08-16 23:58:57.365 myD2-2Array[77579:507] myRowArray1 行下標打印 : 14
2014-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 行下標+列下標打印: 11
2014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 12
2014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 13
2014-08-16 23:58:57.368 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 14
2014-08-16 23:58:57.369 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 21
2014-08-16 23:58:57.369 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 22
2014-08-16 23:58:57.370 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 23
2014-08-16 23:58:57.370 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 24
2014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 31
2014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 32
2014-08-16 23:58:57.371 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 33
2014-08-16 23:58:57.372 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 34
2014-08-16 23:58:57.372 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 41
2014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 42
2014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 43
2014-08-16 23:58:57.373 myD2-2Array[77579:507] myColumnArray 行下標+列下標打印: 44
Air:gcc-code admin$

多維數組:嵌套屢次的 NSMutableArray

理解了上面的二維數組,本身用 NSMutableArray 構造多維數組就很簡單了,由於原理是相同的,只要再定義一個數組如 myDepthArray,把二維數組 myColumnArray 做爲它的元素就能夠了,只是寫起來比較繁瑣,在此就不詳述了。

另外本文主要採用 NSMutableArray 爲例作了說明,其實用 NSArray 實現二維數組和多維數組也很相似,感興趣的朋友能夠本身試着寫寫。

相關文章
相關標籤/搜索