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个元素的可变数组,分别赋值为“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 行下标打印 : 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 实现二维数组和多维数组也很类似,感兴趣的朋友可以自己试着写写。

Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数

时间: 2024-12-24 23:14:20

Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数的相关文章

关于 JavaScript 二维数组和多维数组的定义声明

之前在写扫雷的时候,因为需要用到二维数组,出现了问题,所以记录一下. 当我们在需要使用多维数组的时候,一定要使用正确的声明,不然就会出行令人头大的问题: // 正确的声明 var arr = [] arr[0] = [] arr[1] = [] arr[2] = [] // 或者 arr[0] = [0, 0, 0] arr[1] = [0, 0, 0] arr[2] = [0, 0, 0] 演示一下错误的声明: // 错误的声明 var arr = [] var arr2 = [0, 0, 0

VB.NET 数组的定义 动态使用 多维数组

我们都知道在全部程序设计语言中数组都是一个非常重要的概念,数组的作用是同意程序猿用同一个名称来引用多个变量,因此採用数组索引来区分这些变量.非常多情况下利用数组索引来设置一个循环,这样就能够高效地处理复杂的情况,因此在非常多情况下,使用数组能够缩短或者简化程序的代码.本文主要介绍VB.NET数组的使用,希望对大家的使用带来帮助. 数组中的第一个元素的下标称为下界,最后一个元素的下标称为上界,其余的元素连续地分布在上下界之间,而且数组在内存中也是用连续的区域来存储的,所以要求声明数组每维的长度不能

Android 在资源文件(res/strings.xml)定义一维数组,间接定义二维数组

经常我们会在资源文件(res/strings.xml)定义字符串,一维数组,那定义二维数组?直接定义二维数组没找到,可以间接定义. 其实很简单,看过用过一次就可以记住了,一维数组估计大家经常用到,但是二维数组应该比较少用,因为只能间接定义二维数组. 数组的定义: 数组就是一次性定义相同数据类型的一组变量数组定义. 数组的特点: 1.数组是相同数据类型的元素的集合. 2.数组中的各元素是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起. 3.数组元素用整个数组的名字和它自己在数组中的顺序位

C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <stdlib.h> int main() { int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4=6666; int d1=34, d2=0, d3

《黑马程序员》 NSArray和NSMutableArray的使用(Objective - c语法)

------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>.<a href="http://www.itheima.com" target="blank">.Net培训</a>.期待与您交流! ------- 1 NSArray 的使用方法 • Foundation中数组(NSAr

NSArray与NSMutableArray

1.NSArray基本概念 什么是NSArray NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组 NSArray有哪些使用注意 只能存放任意OC对象, 并且是有顺序的 不能存储非OC对象, 比如int\float\double\char\enum\struct等 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素 NSArray使用NSLog()打印,输出的是小括号的格式. NSArray中不能存储nil

Objective-C学习-数组 NSArray 和 NSMutableArray(欢迎提意见)

在学习 Objective-C的过程中,感觉数组在这一个学习方面是一个比较大的应用域,所以写这篇随笔来总结一下. 首先声明的是,与C语言的数组不同,Objective-C的是数组只能用来存储对象,而不是存储int .double.char等基础数据类型,一般要存这些基础数据类型,对于我这个刚学 Objective-C的新手来说,我的做法是将有关数字的基础类型 如 int .double.char首先转换成一个叫做 NSNumber的类  char*类型的转换成  Objective-C的字符串

IOS阶段学习第15天笔记(NSArray与NSMutableArray 数组)

IOS学习(OC语言)知识点整理 一.OC中的数组 1)数组:也是一个对象,数组中存放的是对象的地址,可以存放任意类型对象的地址,只能是对象不能是具体的数值,数组是有序的,      可以存放重复的元素,数组也分为不可变数组和可变数组.       1.不可变数组NSArray:初始化之后不能修改数组的内容       2.可变数组NSMutableArray:可以随时修改数组的内容(增加元素.删除元素.修改元素) 二.NSArray数组的操作 1)NSArray数组的创建 1.创建方法一:使用

Foundation框架中NSArray和NSMutableArray

=================== NSArray ====================(不可变数组,一旦建立就不能被更改) Ordered collection of objects. Immutable(you cannot add or remove objects to it once it’s created)Important methods:+ (id)arrayWithObjects:(id)firstObject, ...;    // nil terminated -