多维数组

多维数组

廖雪峰

资深软件开发工程师,业余马拉松选手。

二维数组

二维数组就是数组的数组。定义一个二维数组如下:

// 二维数组

public class Main {

public static void main(String[] args) {

int[][] ns = {

{ 1, 2, 3, 4 },

{ 5, 6, 7, 8 },

{ 9, 10, 11, 12 }

};

System.out.println(ns.length); // 3

}

}

因为ns包含3个数组,因此,ns.length为3。实际上ns在内存中的结构如下:

┌───┬───┬───┬───┐

┌───┐ ┌──▶│ 1 │ 2 │ 3 │ 4 │

ns ─────▶│░░░│──┘ └───┴───┴───┴───┘

├───┤ ┌───┬───┬───┬───┐

│░░░│─────▶│ 5 │ 6 │ 7 │ 8 │

├───┤ └───┴───┴───┴───┘

│░░░│──┐ ┌───┬───┬───┬───┐

└───┘ └──▶│ 9 │10 │11 │12 │

└───┴───┴───┴───┘

如果我们定义一个普通数组arr0,然后把ns[0]赋值给它:

// 二维数组

public class Main {

public static void main(String[] args) {

int[][] ns = {

{ 1, 2, 3, 4 },

{ 5, 6, 7, 8 },

{ 9, 10, 11, 12 }

};

int[] arr0 = ns[0];

System.out.println(arr0.length); // 4

}

}

实际上arr0就获取了ns数组的第0个元素。因为ns数组的每个元素也是一个数组,因此,arr0指向的数组就是{ 1, 2, 3, 4 }。在内存中,结构如下:

arr0 ─────┐

┌───┬───┬───┬───┐

┌───┐ ┌──▶│ 1 │ 2 │ 3 │ 4 │

ns ─────▶│░░░│──┘ └───┴───┴───┴───┘

├───┤ ┌───┬───┬───┬───┐

│░░░│─────▶│ 5 │ 6 │ 7 │ 8 │

├───┤ └───┴───┴───┴───┘

│░░░│──┐ ┌───┬───┬───┬───┐

└───┘ └──▶│ 9 │10 │11 │12 │

└───┴───┴───┴───┘

访问二维数组的某个元素需要使用array[row][col],例如:

System.out.println(ns[1][2]); // 7

二维数组的每个数组元素的长度并不要求相同,例如,可以这么定义ns数组:

int[][] ns = {

{ 1, 2, 3, 4 },

{ 5, 6 },

{ 7, 8, 9 }

};

这个二维数组在内存中的结构如下:

┌───┬───┬───┬───┐

┌───┐ ┌──▶│ 1 │ 2 │ 3 │ 4 │

ns ─────▶│░░░│──┘ └───┴───┴───┴───┘

├───┤ ┌───┬───┐

│░░░│─────▶│ 5 │ 6 │

├───┤ └───┴───┘

│░░░│──┐ ┌───┬───┬───┐

└───┘ └──▶│ 7 │ 8 │ 9 │

└───┴───┴───┘

要打印一个二维数组,可以使用两层嵌套的for循环:

for (int[] arr : ns) {

for (int n : arr) {

System.out.print(n);

System.out.print(', ');

}

System.out.println();

}

或者使用Java标准库的Arrays.deepToString():

// 二维数组

import java.util.Arrays;

public class Main {

public static void main(String[] args) {

int[][] ns = {

{ 1, 2, 3, 4 },

{ 5, 6 },

{ 7, 8, 9 }

};

System.out.println(Arrays.deepToString(ns));

}

}

三维数组

三维数组就是二维数组的数组。可以这么定义一个三维数组:

int[][][] ns = {

{

{1, 2, 3},

{4, 5, 6},

{7, 8, 9}

},

{

{10, 11},

{12, 13}

},

{

{14, 15, 16},

{17, 18}

}

};

它在内存中的结构如下:

┌───┬───┬───┐

┌───┐ ┌──▶│ 1 │ 2 │ 3 │

┌──▶│░░░│──┘ └───┴───┴───┘

│ ├───┤ ┌───┬───┬───┐

│ │░░░│─────▶│ 4 │ 5 │ 6 │

│ ├───┤ └───┴───┴───┘

│ │░░░│──┐ ┌───┬───┬───┐

┌───┐ │ └───┘ └──▶│ 7 │ 8 │ 9 │

ns ────▶│░░░│──┘ └───┴───┴───┘

├───┤ ┌───┐ ┌───┬───┐

│░░░│─────▶│░░░│─────▶│10 │11 │

├───┤ ├───┤ └───┴───┘

│░░░│──┐ │░░░│──┐ ┌───┬───┐

└───┘ │ └───┘ └──▶│12 │13 │

│ └───┴───┘

│ ┌───┐ ┌───┬───┬───┐

└──▶│░░░│─────▶│14 │15 │16 │

├───┤ └───┴───┴───┘

│░░░│──┐ ┌───┬───┐

└───┘ └──▶│17 │18 │

└───┴───┘

如果我们要访问三维数组的某个元素,例如,ns[2][0][1],只需要顺着定位找到对应的最终元素15即可。

理论上,我们可以定义任意的N维数组。但在实际应用中,除了二维数组在某些时候还能用得上,更高维度的数组很少使用。

练习

使用二维数组可以表示一组学生的各科成绩,请计算所有学生的平均分:

public class Main {

public static void main(String[] args) {

// 用二维数组表示的学生成绩:

int[][] scores = {

{ 82, 90, 91 }, // 学生甲的语数英成绩

{ 68, 72, 64 }, // 学生乙的语数英成绩

{ 95, 91, 89 }, // ...

{ 67, 52, 60 },

{ 79, 81, 85 },

};

// TODO:

double average = 0;

System.out.println(average);

if (Math.abs(average - 77.733333) < 0.000001) {

System.out.println("测试成功");

} else {

System.out.println("测试失败");

}

}

}

下载练习

小结

二维数组就是数组的数组,三维数组就是二维数组的数组;

多维数组的每个数组元素长度都不要求相同;

打印多维数组可以使用Arrays.deepToString();

最常见的多维数组是二维数组,访问二维数组的一个元素使用array[row][col]。

相关推荐

迪巴拉:希望得到阿根廷征召参加明年世界杯 是穆帅吸引我来罗马
[世界杯]B组:伊朗VS西班牙 完整赛事
求正规英国365网址

[世界杯]B组:伊朗VS西班牙 完整赛事

📅 06-28 👁️ 5321
钽坩埚介绍及应用
365bet中文官方网站

钽坩埚介绍及应用

📅 06-29 👁️ 4812
自拍神器十大品牌排行榜
be七365官网

自拍神器十大品牌排行榜

📅 07-17 👁️ 9485
收获日2枪支哪个好用 收获日2好用的步枪推荐
be七365官网

收获日2枪支哪个好用 收获日2好用的步枪推荐

📅 07-10 👁️ 8144
搕拌的意思
365bet中文官方网站

搕拌的意思

📅 07-15 👁️ 6881