首页 > 其他分享 >多维数组

多维数组

时间:2024-08-08 14:06:54浏览次数:15  
标签:count index 数组 int 二维 一维 多维

4.3 多维数组


目录

4.3.1 二维数组

数组不止能存储某具体值,还能用 数组 储存数组。

介绍:

  • 我们前面学的数组都是一维数组,数组里存储的是具体的值,就是一位数组。
  • 数组不仅可以储存值,还能储存另外一个完整的数组。这种使用 数组储存 数组 的数组我们叫二位数组。
  • 具体语法: 类型 数组名[][] = {{1, 3, 5}, {2, 4, 6}, {7, 9, 11}, {8, 10, 12}};
一、二维数组定义方法
二维素组`和`一维数组`一样,一样可以分为`静态初始化` 和 `动态初始化

静态初始化

// 声明要存放的值的类型  数组名   声明这是一个二维数组
int twoDimensionalArray [][] = {
    {1, 2, 3}, 
    {4, 5, 6},
    {7, 8, 9}
};

动态初始化

  • 动态初始化与一维数组的动态初始化一样,都是先定义后使用。
// 只定义,不使用
int twoDimensional [][];
二、二维数组的运行机制

前面我们说到了 『数组不仅可以储存值,还能储存另外一个完整的数组』但严格来说这句话不对;

其实二维数组并不是直接开辟一个大空间来将里面的数组一个一个进行存放,而是为里面的每一个一维数组单独开辟空间,然后把这个一维数组空间的内存地址储存到二维数组中,作为二维数组的值。

上面的说法有点绕,你可以把二维数组里面的每一个值理解为一个变量,这个变量指向的是一个一维数组

/*
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
int c[] = {7, 8, 9};

假设 变量 d 是一个二维数组,
而上面变量 abc 都是二维数组的值(因为abc变量指向的都是它对应的数组的内存地址,我们现在就把变量abc看成是其对定数组的内存地址)
d[] = {a, b, c};
*/
三、二维数组的使用

静态使用

// 定义二维数组
int staticTwoDimensional[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
// 取出这个二维数组中第2个数组的最后一个元素
int result = staticTwoDimensional[1][staticTwoDimensional[1].length - 1];
System.out.println(result);

// 循环遍历读取二维数组中每个数组的值,且每个数组单独一行输出
for (int count = 0; count < staticTwoDimensional.length; count++) {  // 获取二维数组的最大索引
    System.out.print("{");
    // 获取二维数组的索引对应的一维数组的最大索引
    for (int index = 0; index < staticTwoDimensional[count].length; index++) {
        System.out.print(staticTwoDimensional[count][index] + ", ");
    }
    System.out.println("}");
}

动态使用

动态初始化有两种使用方式,分别是 静态定义一维数组长度动态定义一位数组程度

  • 静态定义一维数组长度
// 定义二维数组,但先不使用
int diynamicTwoDimensional[][];
// 新建二维数组对象
// 语句解释: 二维数组名称 = new(新建对象) int(每个一位数组要存放的类型) [3](要存放的一维数组的数量) [5](每个一位数组存放的最大元素数量)
diynamicTwoDimensional = new int[3][5];

int num = 1;
// 循环填充元素
// 外层循环作用: 获取二维数组的最大存储值,并循环最大存储值次
for (int count = 0; count < diynamicTwoDimensional.length; count++) {
    // 内层循环作用: 获取二维数组中一维数组的最大元素储存数量,并循环最大储存次,填充元素
    for (int index = 0; index < diynamicTwoDimensional[count].length; index++) {
        diynamicTwoDimensional[count][index] = num;
        num++;
    }
}

填充完后 diynamicTwoDimensional 数组的状态是:

/*
{
	{1, 2, 3, 4, 5},
	{6, 7, 8, 9, 10},
	{11, 12, 13, 14, 15}
}
*/
  • 动态定义一维数组长度

在多维数组使用的时候有时候在内层的数组长度不确定就可以使用动态定义长度的方法。如int arr[][] = {{1}, {1, 2}, {1, 2, 3}}

// 声明一个二维数组
int dynamicDimensional = [][];
// 声明这个二维数组能存放的一维数组的数量,但不声明一维数组的长度
dynamicDimensional = new int[3][];

要点:

  1. 多维数组第一个不同索引指定的是不同维度的数组,如 二维数组 第一个[] 指定的这个数组能存放的一维数组的数量,第二个[]指定的就是二维数组第几个值里存放的一维数组的索引
  2. 与一维数组相似,不过二维数组储存的是一维数组的内存地址。
  3. 要操作具体的数组,需要指定这个数组存在的维度的索引,不限于二维数组,包括三维四维......等 维度从高往低依次递减,其结构呈现为树状图。
四、多维数组之间的关系

我们创建一个三位数组,假设三维数组是中国,而三维数组中的每一个值代表一个省份 如索引 0 代表广东,索引 1 代表湖南,2 代表四川...... 然后用一维数组储存这个省份的城市

String array[][][] = {  // 这是三维数组
    {  // 这三维数组的第一个元素, 代表 广东省
        {"深圳", "广州", "佛山", "东莞"}  // 这是一维数组,广东省的城市
    },

    {  // 这三维数组的第二个元素, 代表 湖南省
        {"长沙", "岳阳", "常德", "衡阳"}  // 这是一维数组,湖南省的城市
    },

    {  // 这三维数组的第三个元素, 代表 四川省
        {"成都", "绵阳", "宜宾", "德阳"}  // 这是一维数组,四川省的城市
    }
};

以上数组如果我们要找到德阳市我们就需要先找到德阳市对应的省份 四川省 要找到四川省就得先找到 中国

  1. 我们使用了 三维数组的第一个元素代表中国即:array[0]
  2. 使用的三维数组的元素的元素表示省份,0广东、1湖南、2四川 即:array[0][2]
  3. 使用一维数组储存城市即:array[0][2][3]

这样就找到了德阳。


4.3.2 同时定义多个数组

声明二维数组的语句除了前面两种,还可以 int[] 数组名[]

// 同时定义两个一维数组
int[] x, y;
int x[], y[];  // 这两者写法等价 都是定义两个一维数组

// 同定义两个二维数组
// 以下三种写法等价
int[][] x, y;
int x[][], y[][];
int[] x[], y[];

// 同时定义一维数组和二维数组
// 下列写法都是等价的
int[] x[], y;  // x是二维数组,y是一维数组
int[] y,x[];  // 与上面的写法一样
int x[][], y[];

4.3.3 二维数组应用题

杨辉三角

// 定义要计算的行数
int line = 5;
// 创建二维数组,并指定二维数组的长度,但不定义一维数组的长度
int yangHuiTriangle[][] = new int[line][];
// 循环单独处理每一行
for (int count = 0; count < line; count++) {
    // 开辟一维数组空间, 每行的长度是count + 1
    yangHuiTriangle[count] = new int[count + 1];
    // 处理一维数组, 也就是每一行需要填充什么值
    for (int index = 0; index < count + 1; index++) {
        // 判断 如果不是行首和行尾 执行计算,否则填充 1
        if (index != 0 && index != count) {
            yangHuiTriangle[count][index] = yangHuiTriangle[count - 1][index] + yangHuiTriangle[count - 1][index - 1];
        } else {
            yangHuiTriangle[count][index] = 1;
        }
    }
}

for (int count = 0; count < yangHuiTriangle.length; count++) {

    // 打印行首的空格
    for (int space = 1; space <= line - (count + 1); space++) {
        System.out.print("  ");
    }


    for (int index = 0; index < yangHuiTriangle[count].length; index++) {
        int result = yangHuiTriangle[count][index];
        // 处理数字后面的空格,
        // ! 但这不是优雅的解决方案, 如果数字多了排版还是会乱,等日后再回来解决吧
        if (result	< 10) {
            System.out.print(result + "   ");
        } else if (result < 100) {
            System.out.print(result + "  ");
        }else{
            System.out.print(result + " ");
        }
    }
    System.out.println();
}

结果

        1   
      1   1   
    1   2   1   
  1   3   3   1   
1   4   6   4   1   


4.3.4 多维数组细节

  1. 一维数组的声明方式有两种:
    1. int[] 数组名
    2. int 数组名[]
  2. 二维数组的声明方式有三种:
    1. int[][] 数组名
    2. int 数组名[][]
    3. int[] 数组名[]
  3. 二维数组实际上是由多个一维数组构成的,它的各个一维数组长度可以相同也可以不同。

标签:count,index,数组,int,二维,一维,多维
From: https://www.cnblogs.com/hweiling/p/18344512

相关文章

  • 数组排序算法
    4.2数组排序算法4.2.1冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“......
  • leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列
    leetcode718和leetcode1143两道十分相似的题,就不放题目了思路实际上区别就在于一个要求连续数组,另一个要求不连续的序列。二者的dp表达式和状态转移其实是不一致的,前者f[i][j]代表nums1以i结尾nums2以j结尾的最长子数组长度,后者代表nums1以i结尾nums2以j结尾的区间内存......
  • C语言字符数组,字符指针,指针数组(字符串)的比较与使用
    参考文档https://blog.csdn.net/yuabcxiao/article/details/89600907 字符数组与字符指针在C语言中,可以用两种方法表示和存放字符串:(1)用字符数组存放一个字符串charstr[]="Iamhappy";(2)用字符指针指向一个字符串char*str="Iamhappy";字符数组#include<iostrea......
  • Java中一维数组的学习
    一维数组目录一维数组创建数组null数组的遍历for循环遍历数组for-each循环遍历while循环遍历do-while循环遍历数组的反向遍历创建数组Java语言使用new操作符来创建数组,语法如下:arrayRefVar=newdataType[arraySize];上面的语法语句做了两件事:使用dataType[arraySize]......
  • Java数组篇[1]:数组的定义和声明
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • Java数组篇[2]:数组的初始化
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • (nice!!!)LeetCode 3130. 找出所有稳定的二进制数组 II(动态规划dp)
    题目:3130.找出所有稳定的二进制数组II思路:大佬的思路classSolution{public:intmod=1e9+7;typedeflonglongLL;LLsta[1010][1010][2];//当前还有i个0、j个1时,第i+j的位置放置u,可以组成的合法数目LLdfs(inti,intj,intu,intlimit)......
  • new_d_array()函数接受一个int类型的参数和double类型的参数。该函数返回一个指针,指向
    /*下面是使用变参函数的一段程序:include<stdio.h>include<string.h>incude<stdarg.h>voidshow_array(constdoublear[],intn);double*new_d_array(intN,...);intmain(void){doublep1;doublep2;p1=new_d_array(5,1.2,2.3,3.4,4.5,5.6);p2=new_d_ar......
  • js 将十进制字符串转换成4字节的字节数组
    函数functionconvertToHexArrays(input){//通过制表符分割输入字符串constnumbers=input.split('\t');//用于存储结果的数组constresult=[];for(letnumofnumbers){//将字符串转换为数字constvalue=parseInt(num)......
  • 力扣1.给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值
    1.给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。letnums=[1,2,4,5,3,2,4,6......