精讲:java之多维数组的使用

news2024/9/28 11:15:28

一、多维数组简介

1.为什么需要二维数组

我们看下面这个例子?“

        某公司2022年全年各个月份的销售额进行登记。按月份存储,可以使用一维数组。如果改写为按季度为单位存储怎么办呢?

        或许现在学习了一维数组的你只能申请四个一维数组去存储每个季度的销售额吧?和一一维数组的思想一样,能不能有一个容器将这四个一维数组装起来然后提供一个统一的变量名供我们使用呢?答案是肯定的。我们在学习一维数组的时候也学到,数组的元素可以是基本数据类型也可以是引用数据类型,而数组本身就是引用数据类型。所以可以将数组作为数组的元素,这就是多维数组。

例如:

按月份int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66};
按季度int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}};

总结:

  • 对于二维数组的理解,可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。

  • 其实,从数组底层的运行机制来看,其实没有多维数组。

二、二维数组的声明与初始化

1.二维数组的声明

语法格式

//推荐
元素的数据类型[][] 二维数组的名称;

//不推荐(但可行)
元素的数据类型  二维数组名[][];
//不推荐(但可行)
元素的数据类型[]  二维数组名[];

举例

public class Test20TwoDimensionalArrayDefine {
    public static void main(String[] args) {
        //存储多组成绩
        int[][] grades;

        //存储多组姓名
        String[][] names;

        int[] x, y[];//x是一维数组,y是二维数组
    }
}

2.二维数组的静态初始化

格式int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
举例

int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}};//声明与初始化必须在一句完成(类型推断)

int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

int[][] arr;
arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9,10}};//错误,静态初始化右边new 数据类型[][]中不能写数字

注意:二维数组也有length属性。例如:arr.length;与 arr[2].length;

3.二维数组的动态初始化

a)使用场景

如果二维数组的每一个数据,甚至是每一行的列数,需要后期单独确定,那么就只能使用动态初始化方式了。动态初始化方式分为两种格式。

b)格式一:规则二维表(每一行的列数是相同的)

格式

//(1)确定行数和列数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
    //其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
    //其中,n:表示每一个一维数组的元素有多少个。或者说每一行共有一个单元格

//此时创建完数组,行数、列数确定,而且元素也都有默认值

//(2)再为元素赋新值
二维数组名[行下标][列下标] = 值;

举例

int[][] arr = new int[3][2];

  • 定义了名称为arr的二维数组

  • 二维数组中有3个一维数组

  • 每一个一维数组中有2个元素

  • 一维数组的名称分别为arr[0], arr[1], arr[2]

  • 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;

c)格式二:不规则二维表(每一行的列数不一样)

格式

//(1)先确定总行数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];

//此时只是确定了总行数,每一行里面现在是null

//(2)再确定每一行的列数,创建每一行的一维数组
二维数组名[行下标] = new 元素的数据类型[该行的总列数];

//此时已经new完的行的元素就有默认值了,没有new的行还是null

//(3)再为元素赋值
二维数组名[行下标][列下标] = 值;

举例

int[][] arr = new int[3][];

  • 二维数组中有3个一维数组。

  • 每个一维数组都是默认初始化值null (注意:区别于格式1)

  • 可以对这个三个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

  • 注:int[][]arr = new int[][3]; //非法

4.数组的长度和角标

说明

  • 二维数组的长度/行数:二维数组名.length

  • 二维数组的某一行:二维数组名[行下标],此时相当于获取其中一组数据。它本质上是一个一维数组。行下标的范围:[0, 二维数组名.length-1]。此时把二维数组看成一维数组的话,元素是行对象。

  • 某一行的列数:二维数组名[行下标].length,因为二维数组的每一行是一个一维数组。

  • 某一个元素:二维数组名[行下标][列下标],即先确定行/组,再确定列。

举例

public class Test22TwoDimensionalArrayUse {
    public static void main(String[] args){
        //存储3个小组的学员的成绩,分开存储,使用二维数组。
        /*
        int[][] scores1;
        int scores2[][];
        int[] scores3[];*/

        int[][] scores = {
                {85,96,85,75},
                {99,96,74,72,75},
                {52,42,56,75}
        };

        System.out.println(scores);//[[I@15db9742
        System.out.println("一共有" + scores.length +"组成绩.");

        //[[:代表二维数组,I代表元素类型是int
        System.out.println(scores[0]);//[I@6d06d69c
        //[:代表一维数组,I代表元素类型是int
        System.out.println(scores[1]);//[I@7852e922
        System.out.println(scores[2]);//[I@4e25154f
        //System.out.println(scores[3]);//ArrayIndexOutOfBoundsException: 3

        System.out.println("第1组有" + scores[0].length +"个学员.");
        System.out.println("第2组有" + scores[1].length +"个学员.");
        System.out.println("第3组有" + scores[2].length +"个学员.");

        System.out.println("第1组的每一个学员成绩如下:");
        //第一行的元素
        System.out.println(scores[0][0]);//85
        System.out.println(scores[0][1]);//96
        System.out.println(scores[0][2]);//85
        System.out.println(scores[0][3]);//75
        //System.out.println(scores[0][4]);//java.lang.ArrayIndexOutOfBoundsException: 4
    }
}

三、二维数组的遍历

格式for(int i=0; i<二维数组名.length; i++){ //二维数组对象.length
    for(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.length
        System.out.print(二维数组名[i][j]);
    }
    System.out.println();
}
举例

public class Test23TwoDimensionalArrayIterate {
    public static void main(String[] args) {
        //存储3个小组的学员的成绩,分开存储,使用二维数组。
        int[][] scores = {
                {85,96,85,75},
                {99,96,74,72,75},
                {52,42,56,75}
        };

        System.out.println("一共有" + scores.length +"组成绩.");
        for (int i = 0; i < scores.length; i++) {
            System.out.print("第" + (i+1) +"组有" + scores[i].length + "个学员,成绩如下:");
            for (int j = 0; j < scores[i].length; j++) {
                System.out.print(scores[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

四、二维数组的默认值

举例

①int[][] arr1 = new int[][];

②int[][] arr2 = new int[2][];

③int[][] arr3 = new int[3][3];

......

说明

①写法是错误的,因为在创建二维数组的时候缺少维数,不知道创建多大空间。

②创建一个有两个元素的二维数组,由于两个元素并未定义,而二维数组是引用数据类型,所以两个元素的默认值均为null。

③创建一个有三个元素的二维数组,由于三个元素均定义为int类型的一维数组,所以二维数组的三个元素保存的是三个一维数组的地址值。而三个一维数组是int类型一维数组,所以默认值是0。

......

总结

①byte、short、int的默认值是0

②long的默认值是0L

③float的默认值是0.0F

④double的默认值是0.0

⑤char的默认值是0或‘\u0000’(表现为空)

⑥boolean的默认值是false

⑦引用类型的默认值是null

五、内存解析

解析一:

解析二:

 

六、案例

案例一:获取arr数组中所有元素的和。

public class test {
    public static void main(String[] args) {
        int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
        
        int sum = 0;
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
                sum += arr[i][j];
            }
        }
        System.out.println("总和为:" + sum);
    }
}

案例二:声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:

声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:
a)    x[0] = y;                 //no
b)    y[0] = x;                 //yes
c)    y[0][0] = x;              //no
d)    x[0][0] = y;              //no
e)    y[0][0] = x[0];           //yes
f)    x = y;                    //no

提示:
一维数组:int[] x  或者int x[]   
二维数组:int[][] y 或者  int[] y[]  或者 int  y[][]

案例三:使用二维数组打印一个 10 行杨辉三角。

public class YangHuiTest {
    public static void main(String[] args) {

        //1. 动态初始化的方式创建二维数组
        int[][] yangHui = new int[10][];

        for (int i = 0; i < yangHui.length; i++) {
            yangHui[i] = new int[i + 1];

            //2. 给数组元素赋值
            // 2.1 给外层数组元素中的首元素和末元素赋值
            yangHui[i][0] = yangHui[i][i] = 1;

            //2.2 给外层数组元素中的非首元素和非末元素赋值(难)
            //if(i > 1){ //从 i == 2 开始执行
                for(int j = 1;j < yangHui[i].length - 1;j++){ //非首元素和非末元素的角标范围
                    yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];

                }
            //}
        }

        //3. 遍历二维数组
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j] + "\t");
            }

            System.out.println();
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Kotlin:从K1到K2

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 嘿&#xff0c;小伙伴们&#xff01;今天我们来聊聊Kotlin&#xff0c;这个在安卓开发圈里越来越火的编程语言。…

轴心轨迹的绘制(包含降噪前处理,MATLAB)

由于旋转机械振动波形的噪声干扰大&#xff0c;直接对振动数据特征提取和选择的故障诊断方法&#xff0c;其精度容易受到噪声影响。当前&#xff0c;基于图像的旋转机械故障诊断技术已经得到飞速的发展。针对旋转机械的故障诊断问题&#xff0c;传统方法趋向于从振动数据中提取…

用6000万茅台案,了解什么是外挂?

近日&#xff0c;一起涉案金额高达6000余万元的案件出现在人们视野中。此前浙江丽水云和县公安局侦破了一起非法利用软件抢购电商平台茅台酒案。 据了解&#xff0c;犯罪嫌疑人以非法牟利为目的&#xff0c;开发了抢购软件&#xff0c;以有偿原价抢购电商平台飞天茅台酒为噱头&…

android13 rom frameworks 蓝牙自动接收文件

总纲 android13 rom 开发总纲说明 目录 1.前言 2.源码查找 3.我们先实现第一种改法 4.实现第二种改法 5.第三种改法代码参考 6.编译测试 1.前言 我们从导航栏这里,点开这个蓝牙的接收框,弹出来的对话框,使用android studio 的layout inspector可以发现这个是 Bluetoo…

如何用IP地址申请SSL证书实现网络安全

互联网是一个全球性的网络&#xff0c;它将世界各地的计算机系统和设备连接在一起。在这个庞大的网络中&#xff0c;每个设备都需要一个唯一的标识符&#xff0c;即IP&#xff08;Internet Protocol&#xff09;地址&#xff0c;以便其他设备能够找到并与其通信。然而&#xff…

解密 AI 客服:LangChain+ChatGPT 打造智能客服新时代

你需要了解 ChatGPT ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练&#xff0c;自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点&#xff0c;可以帮助人们更加高效地处理信息和交流。 ChatGPT 有很多…

硅纪元视角 | 电信公司出招!AI机器人全面反击AI诈骗电话

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均包含简要注释。 获取方式 https:/…

强化学习中的蒙特卡洛算法和时序差分算法

在强化学习&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;价值函数的估计是核心任务之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和时序差分&#xff08;Temporal Difference, TD&#xff09;方法是两种常用的策略&#xff0c;用于估计状态…

儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享

随着科技的不断发展和生活方式的改变&#xff0c;儿童青少年近视率的增长趋势引起了人们的关注。近视不仅对孩子们的视力健康构成威胁&#xff0c;还可能对他们的学习和日常生活带来不便。因此&#xff0c;如何有效地预防和改善儿童青少年的视力问题成为了一个亟待解决的课题。…

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快&#xff0c;校园快递成为一个重要的服务需求。然而&#xff0c;传统的校园快递方式存在一些问题&#xff0c;例如无法满足快速和高效的需求&#xff0c;易发生丢失或损坏的情况&#xff0c;同时也给快递人员和用户带来不便。因此&am…

AI转绘_animatediff-cli-prompt-travel

这个工具有两种主要模式&#xff1a;它可以直接通过提示创建视频&#xff0c;或者它可以对现有视频进行风格化。还有方法可以提高视频的分辨率。 正如工具名称所示&#xff0c;它的一个主要特点是"提示旅行"。这意味着你可以例如使用特定的提示用于前20帧&#xff0…

多个标签页中复用同一 QTableView

在 PyQt 中实现在多个标签页中复用同一个 QTableView 实例&#xff0c;复用同一个 QTableView 实例可以减少内存和资源的使用。每个 QTableView 实例都会消耗一定的内存和处理资源&#xff0c;如果每个标签页都创建一个新的实例&#xff0c;会增加系统的负担。通过复用实例&…

TQZC706开发板教程:在ZC706+ADRV9009硬件平台运行ADI Linux

本教程使用2024-06-18的ADI镜像文件&#xff0c;创建ZC706ADRV9009的linux工程进行测试。 首先需要下载ADI的镜像文件下载地址如所示&#xff1a; https://wiki.analog.com/resources/tools-software/linux-software/adi-kuiper_images/release_notes#r2_patch_1 烧写完成后若…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…

手撕算法拿捏八大神经网络!叫我机器学习大师

八大神经网络通常指的是在深度学习领域具有里程碑意义的八种神经网络模型或架构。这些模型在特定任务上取得了显著的性能&#xff0c;或者在深度学习的发展中起到了关键作用。 以下是这八大神经网络的一个简要概述及其学习建议&#xff1a; 多层感知器 (MLP)&#xff1a;最基本…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

如何计算多路复用器的建立时间和采样速率

简介 计算开关或多路复用器建立时间的基本方法是计算器件的RC(即&#xff0c;Ron * Cd)&#xff0c;并乘以所需系统精度的时间常数数量&#xff0c;再加上开关或多路复用器的开关定时Ton、Toff或Ttransition。 建立时间 开关定时 (Ron * CD * 时间常数数量) 其中&#xff1a…

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发 文章目录 人员检测上位机附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput information sent to hostList of detect…