Java数组(2)

我是南城余!阿里云开发者平台专家博士证书获得者!

欢迎关注我的博客!一同成长!

一名从事运维开发的worker,记录分享学习。

专注于AI,运维开发,windows Linux 系统领域的分享!

本章节对应知识库

https://www.yuque.com/nanchengcyu/java

本内容来自尚硅谷课程,此处在知识库做了个人理解
————————————————

4. 一维数组的应用

**案例1:**升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。

public class ArrayTest {public static void main(String[] args) {int[] arr = new int[]{8,2,1,0,3};int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};String tel = "";for(int i = 0;i < index.length;i++){tel += arr[index[i]];}System.out.println("联系方式:" + tel);}
}

案例2:输出英文星期几

用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
{“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”}

import java.util.Scanner;/*** @author 尚硅谷-宋红康* @create 14:37*/
public class WeekArrayTest {public static void main(String[] args) {//1. 声明并初始化星期的数组String[] weeks = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//2. 使用Scanner从键盘获取1-7范围的整数Scanner scanner = new Scanner(System.in);System.out.println("请输入[1-7]范围的整数:");int number = scanner.nextInt();if(number < 1 || number > 7){System.out.println("你输入的输入非法");}else{//3. 根据输入的整数,到数组中相应的索引位置获取指定的元素(即:星期几)System.out.println("对应的星期为:" + weeks[number - 1]);}scanner.close();}
}

**案例3:**从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

  • 成绩>=最高分-10 等级为’A’

  • 成绩>=最高分-20 等级为’B’

  • 成绩>=最高分-30 等级为’C’

  • 其余 等级为’D’

提示:先读入学生人数,根据人数创建int数组,存放学生成绩。

image-20220317004637748
/*** @author 尚硅谷-宋红康* @create 14:55*/
public class ScoreTest1 {public static void main(String[] args) {//1. 根据提示,获取学生人数System.out.print("请输入学生人数:");Scanner scanner = new Scanner(System.in);int count = scanner.nextInt();//2. 根据学生人数,创建指定长度的数组 (使用动态初始化)int[] scores = new int[count];//3. 使用循环,依次给数组的元素赋值int maxScore = 0; //记录最高分System.out.println("请输入" + count + "个成绩");for (int i = 0; i < scores.length; i++) {scores[i] = scanner.nextInt();//4. 获取数组中元素的最大值,即为最高分if(maxScore < scores[i]){maxScore = scores[i];}}System.out.println("最高分是:" + maxScore);//5. 遍历数组元素,输出各自的分数,并根据其分数与最高分的差值,获取各自的等级char grade;for (int i = 0; i < scores.length; i++) {if(scores[i] >= maxScore - 10){grade = 'A';}else if(scores[i] >= maxScore - 20){grade = 'B';}else if(scores[i] >= maxScore - 30){grade = 'C';}else{grade = 'D';}System.out.println("student " + i + " socre is " + scores[i] + ", grade is " + grade);}//关闭资源scanner.close();}
}

5. 多维数组的使用

5.1 概述

  • Java 语言里提供了支持多维数组的语法。

  • 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像Excel中的表格、围棋棋盘一样。

    image-20220317004810263
  • 应用举例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}};
    
    • 应用举例2:

高一年级三个班级均由多个学生姓名构成一个个数组。如下:

String[] class1 = new String[]{"段誉","令狐冲","任我行"};String[] class2 = new String[]{"张三丰","周芷若"};String[] class3 = new String[]{"赵敏","张无忌","韦小宝","杨过"};

那从整个年级看,我们可以声明一个二维数组。如下:

String[][] grade = new String[][]{{"段誉","令狐冲","任我行"},{"张三丰","周芷若"},{"赵敏","张无忌","韦小宝","杨过"}};
  • 应用举例3:

在这里插入图片描述

蓝框的几个元素,可以使用一维数组来存储。但现在发现每个元素下还有下拉框,其内部还有元素,那就需要使用二维数组来存储:

在这里插入图片描述

  • 使用说明

    在这里插入图片描述

  • 对于二维数组的理解,可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
  • 其实,从数组底层的运行机制来看,其实没有多维数组。

5.2 声明与初始化

5.2.1 声明

二维数组声明的语法格式:

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

例如:

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

面试:

int[] x, y[];
//x是一维数组,y是二维数组
5.2.2 静态初始化

格式:

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

定义一个名称为arr的二维数组,二维数组中有三个一维数组

  • 每一个一维数组中具体元素也都已初始化
    • 第一个一维数组 arr[0] = {3,8,2};
    • 第二个一维数组 arr[1] = {2,7};
    • 第三个一维数组 arr[2] = {9,0,1,6};
  • 第三个一维数组的长度表示方式:arr[2].length;
  • 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
  • 举例1:
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 数据类型[][]中不能写数字
  • 举例2:
public class TwoDimensionalArrayInitialize {public static void main(String[] args) {//存储多组成绩int[][] grades = {{89,75,99,100},{88,96,78,63,100,86},{56,63,58},{99,66,77,88}};//存储多组姓名String[][] names = {{"张三","李四", "王五", "赵六"},{"刘备","关羽","张飞","诸葛亮","赵云","马超"},{"曹丕","曹植","曹冲"},{"孙权","周瑜","鲁肃","黄盖"}};}
}
5.2.3 动态初始化

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

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

//(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;

格式2:不规则:每一行的列数不一样

//(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]; //非法

练习:

/*12 23 3 34 4 4 45 5 5 5 5*/
public class Test25DifferentElementCount {public static void main(String[] args){//1、声明一个二维数组,并且确定行数//因为每一行的列数不同,这里无法直接确定列数int[][]  arr = new int[5][];//2、确定每一行的列数for(int i=0; i<arr.length; i++){/*arr[0] 的列数是1arr[1] 的列数是2arr[2] 的列数是3arr[3] 的列数是4arr[4] 的列数是5*/arr[i] = new int[i+1];}//3、确定元素的值for(int i=0; i<arr.length; i++){for(int j=0; j<arr[i].length; j++){arr[i][j] = i+1;}}//4、遍历显示for(int i=0; i<arr.length; i++){for(int j=0; j<arr[i].length; j++){System.out.print(arr[i][j] + " ");}System.out.println();}}
}

5.3 数组的长度和角标

  • 二维数组的长度/行数:二维数组名.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@15db9742System.out.println("一共有" + scores.length +"组成绩.");//[[:代表二维数组,I代表元素类型是intSystem.out.println(scores[0]);//[I@6d06d69c//[:代表一维数组,I代表元素类型是intSystem.out.println(scores[1]);//[I@7852e922System.out.println(scores[2]);//[I@4e25154f//System.out.println(scores[3]);//ArrayIndexOutOfBoundsException: 3System.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]);//85System.out.println(scores[0][1]);//96System.out.println(scores[0][2]);//85System.out.println(scores[0][3]);//75//System.out.println(scores[0][4]);//java.lang.ArrayIndexOutOfBoundsException: 4}
}

5.4 二维数组的遍历

  • 格式:
for(int i=0; i<二维数组名.length; i++){ //二维数组对象.lengthfor(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.lengthSystem.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();}}
}

5.5 内存解析

二维数组本质上是元素类型是一维数组的一维数组。

int[][] arr = {{1},{2,2},{3,3,3},{4,4,4,4},{5,5,5,5,5}
};

在这里插入图片描述

//1、声明二维数组,并确定行数和列数
int[][] arr = new int[4][5];//2、确定元素的值
for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {arr[i][j] = i + 1;}
}

在这里插入图片描述

//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][]  arr = new int[5][];//2、确定每一行的列数
for(int i=0; i<arr.length; i++){/*arr[0] 的列数是1arr[1] 的列数是2arr[2] 的列数是3arr[3] 的列数是4arr[4] 的列数是5*/arr[i] = new int[i+1];
}//3、确定元素的值
for(int i=0; i<arr.length; i++){for(int j=0; j<arr[i].length; j++){arr[i][j] = i+1;}
}

在这里插入图片描述

5.6 应用举例

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

提示:使用for的嵌套循环即可。

在这里插入图片描述

**案例2:**声明: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[][]

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

提示:

  1. 第一行有 1 个元素, 第 n 行有 n 个元素

  2. 每一行的第一个元素和最后一个元素都是 1

  3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:

    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
    

在这里插入图片描述

/*** @author 尚硅谷-宋红康* @create 10:11*/
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.mzph.cn/news/230267.shtml

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

相关文章

Kotlin 笔记 -- Kotlin 语言特性的理解(二)

都是编译成字节码&#xff0c;为什么 Kotlin 能支持 Java 中没有的特性&#xff1f; kotlin 有哪些 Java 中没有的特性&#xff1a; 类型推断、可变性、可空性自动拆装箱、泛型数组高阶函数、DSL顶层函数、扩展函数、内联函数伴生对象、数据类、密封类、单例类接口代理、inter…

西蒙子S7协议介绍

西门子的S7 协议&#xff0c;没有仍何关于S7协议的官方文档&#xff0c;是一个不透明的协议。关于S7的协议介绍&#xff0c;大都是非官方的一些七零八落的文档。 1. S7的通信模型 西蒙子S7 通讯遵从着基于TCP 的 Master&#xff08;client&#xff09; & Slave&#xff0…

读取小数部分

1.题目描述 2.题目分析 //假设字符串为 char arr[] "123.4500"; 1. 找到小数点位置和末尾位置 代码如下&#xff1a; char* start strchr(arr, .);//找到小数点位置char* end start strlen(start) - 1;//找到末尾位置 如果有不知道strchr()用法的同学&#xf…

Linux 基本语句_16_Udp网络聊天室

代码&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h> #include <string…

中小型企业网络综合实战案例分享

实验背景 某公司总部在厦门&#xff0c;北京、上海都有分部&#xff0c;网络结构如图所示&#xff1a; 一、网络连接描述&#xff1a; 厦门总部&#xff1a;内部网络使用SW1、SW2、SW3三台交换机&#xff0c;SW1为作为核心交换机&#xff0c;SW2、SW3作为接入层交换机&#x…

PDF控件Spire.PDF for .NET【转换】演示:将多个图像转换为单个 PDF

如果您想要将多个图像合并为一个文件以便于分发或存储&#xff0c;将它们转换为单个 PDF 文档是一个很好的解决方案。这一过程不仅节省空间&#xff0c;还确保所有图像都保存在一个文件中&#xff0c;方便共享或传输。在本文中&#xff0c;您将学习如何使用Spire.PDF for .NET …

-bash: docker-compose: 未找到命令

-bash: docker-compose: 未找到命令 我在使用Docker搭建Nacos容器时遇到了这个问题&#xff1a;是没有安装 docker-compose工具 。 docker-compose的用处主要体现在以下几个方面&#xff1a; 快速搭建开发环境&#xff1a;使用docker-compose可以快速搭建起开发环境&#xff0…

一分钟轻松制作AI数字人播报视频

随着人工智能的快速发展&#xff0c;AI数字人播报成为了媒体和信息传播领域的一项创新技术。AI数字人播报是利用人工智能技术创建的一系列短视频&#xff0c;以新闻主播为中心&#xff0c;展示各种场景和情境能够以短视频的形式进行新闻的报道。这种创新的内容形式在社交媒体和…

Java刷题篇——单链表练习题上

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例2 输入&#xff1a;head [1,2] 输出&…

Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

高可用接入层技术演化及集群概述

集群概述 集群的介绍及优势 集群&#xff1a;将多台服务器通过硬件或软件的方式组合起来&#xff0c;完成特定的任务&#xff0c;而这些服务器对外表现为一个整体。集群的优势 高可靠性&#xff1a;利用集群管理软件&#xff0c;当主服务器故障时&#xff0c;备份服务器能够自…

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所…

代码随想录算法训练营第五十五天 _ 动态规划_392. 判断子序列、115.不同的子序列。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 392. 判断子序列 这个题目就是 …

消息队列kafka详解:Kafka原理分析总结

一、概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统&#xff0c;后成为Apache的一部分&#xff0c;它使用Scala编写&#xff0c;以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark等都支持与Kafka集成。 Kaf…

SGPIO介紹

什么是SGPIO&#xff1f; Serial General Purpose Input Output (SGPIO) is a method to serialize general purpose IO signals. SGPIO defines the communication between an initiator (e.g. a host bus adapter) and a target (e.g. a backplaneholding disk drives). The …

最小窗口子串算法题——Java解答

题目&#xff1a;最小窗口子串 题目描述&#xff1a; 给你一个字符串 s 和一个字符串 t&#xff0c;返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 ""。 注意&#xff1a; 对于 t 中重复的字符&#xff…

Axure的交互与情形,事件,动作

交互样式 交互样式是指当用户与原型进行交互时&#xff0c;元素所呈现出的视觉效果。在Axure中&#xff0c;可以通过设置交互样式来调整元素在交互过程中的外观&#xff0c;例如改变颜色、大小、位置等。 交互事件 交互事件是指在用户与原型进行交互时触发的动作。在Axure中&…

一次应急响应记录

背景&#xff1a; 周五晚上&#xff0c;我健身完回到宿舍收到qq消息&#xff0c;原来是安全厂商在扫描资产时&#xff0c;发现一批openssh漏洞如下图&#xff1a; 其实我是一名小白&#xff0c;我的第一反应就是升级openssh版本。但是这里问题又来了&#xff0c;我们内网主机是…

Python 自动化之收发邮件(一)

imapclient / smtplib 收发邮件 文章目录 imapclient / smtplib 收发邮件前言一、基本内容二、发送邮件1.整体代码 三、获取邮件1.整体代码 总结 前言 简单给大家写个如何用Python进行发邮件和查看邮件教程&#xff0c;希望对各位有所帮助。 一、基本内容 本文主要分为两部分…

基于ssm在线作业管理系统的设计与实现论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此学生作业信息的…