标签:http java 使用 os io 文件 for ar
说实话,不太习惯面向对象编程,所以在操作 Objective-C
中数组对象时,总是忍不住跟 C
中的数组做比较,正好要建立一个二维数组,需要根据二维数组的下标来做相应的设置,恰好又是第一次使用数组对像,各种不熟悉、不适应。。。多么怀念形如 array[0][1]
的语法形式啊,可惜的是,NSArray
和 NSMutableArray
不能这么搞,于是查了半天资料,又写了几个验证用的小程序,终于明白如何做了,下面详细介绍。
Objective-C
提供了两种数组对像,一种是不可变数组 NSArray
,一种是可变数组 NSMutableArray
。
首先要清楚 C
中的 数组
和 Objective-C
中的 数组对像
的使用差异,前者可以通过赋值 =
来设置一个数组中某个元素的值,如:
int array[0] = 12;
后者则必须通过类中提供的的方法来实现,不能通过 =
赋值的方式来操作,在 Objective-C
中我们使用 Foundation
框架,它为 NSArray
和 NSMutableArray
提供了多种设定数组元素的方法。
我们这里讨论可变数组 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$
在 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 行下标打印 : 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
构造多维数组就很简单了,因为原理是相同的,只要再定义一个数组如 myDepthArray
,把二维数组 myColumnArray
作为它的元素就可以了,只是写起来比较繁琐,在此就不详述了。
另外本文主要采用 NSMutableArray
为例做了说明,其实用 NSArray
实现二维数组和多维数组也很类似,感兴趣的朋友可以自己试着写写。
Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数,布布扣,bubuko.com
Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数
标签:http java 使用 os io 文件 for ar
原文地址:http://my.oschina.net/freeblues/blog/303423