来,继续啊,下面我们来学习二维数组。前面我们讲解的数组,一般称之为一维数组。
为了帮助大家理解二维数组呢?这里我们来看这样的一个场景:
需求:我们要存储多个班级的学生的考试成绩,该怎么办呢?
如果要存储一个班级中多个学生的考试成绩,我们就可以采用数组来存储。
现在的问题是?多个班级的考试成绩,我们针对每个班级都采用数组存储。
第一个班级:数组1
第二个班级:数组2
第三个班级:数组3 …
但是多个班级,也可以采用数组存储啊。所以,Java就提供了二维数组供我们使用。
这里我们给二维数组一个简单的定义:
知道了什么是二维数组后,我们再说一下二维数组的定义格式:
它有这样的三个格式,用[][]表示二维数组:
推荐使用第一种格式。
知道了什么是二维数组以及二维数组的定义格式后,我们来说一下二维数组这一块的课程安排:
首先,我们讲解二维数组初始化,这样我们就能够给二维数组中的元素赋值了。
接着,我们讲解二维数组元素访问,这样我们就能够获取到二维数组中的数据了。
然后,我们讲解二维数组内存图,这样我们就能够对二维数组在内存中的存储和操作做到知其然也知其所以然。
最后,我们讲解二维数组常见操作,这样我们就能够应用二维数组解决常见的问题了。
好了,到此关于二维数组的概述和课程安排我们就先讲到这里。
来,继续啊,下面我们来学习二维数组初始化,和一维数组一样,二维数组初始化也有两种格式:
首先来看静态初始化:
解读:
同样,针对静态初始化,二维数组也给出了简化格式:
再来看动态初始化:
解读:
他们的各自使用场景和一维数组中讲解的是一样的:
静态初始化:适合一开始就能确定元素值的业务场景
动态初始化:适合开始知道数据的数量,但是不确定具体元素值的业务场景
好了,关于二维数组的初始化我们就先讲到这里
来,继续啊,下面我们来学习二维数组元素访问。
关于二维数组的元素访问,我们先到idea中去讲解,然后再回来总结:
xxxxxxxxxx
/*
静态初始化简化格式:数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};
*/
public class ArrayDemo {
public static void main(String[] args) {
//静态初始化简化格式:数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
//输出数组名
System.out.println(arr); //[[I@776ec8df
System.out.println(arr[0]); //[I@4eec7777
System.out.println(arr[1]); //[I@3b07d329
//如何获取到数据1,2,3呢?
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[0][2]);
}
}
讲解完毕后,回到资料总结一下:
好了,关于二维数组的元素访问我们就先讲到这里。
来,继续啊,下面我们来学习二维数组的内存图。
这里呢,我们通过内存图的方式让大家了解一下二维数组在内存中的存储和使用就可以了。
整个过程讲解的是下图代码的执行流程,大家能够听懂即可。
最后,我们自己编写代码验证一下:
xxxxxxxxxx
/*
二维数组内存图代码
*/
public class ArrayTest {
public static void main(String[] args) {
//定义二维数组
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
//输出数组中的元素
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
//修改数组中的元素
arr[0][1] = 10;
arr[1][1] = 20;
//再次输出数组中的元素
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
}
}
由于仅仅是验证讲解的结论,故不需要练习。
来,继续啊,下面我们来学习二维数组常见操作:
这里我们讲解两个操作:
首先,我们来看二维数组遍历。
这里有一个需求:已知一个二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出。
看完需求之后,我们到IDEA中一起去实现一下,然后再回来总结:
xxxxxxxxxx
/*
需求:已知一个二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出
*/
public class ArrayTest01 {
public static void main(String[] args) {
//定义二维数组,并进行静态初始化
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//获取数据1,2,3
// System.out.println(arr[0][0]);
// System.out.println(arr[0][1]);
// System.out.println(arr[0][2]);
// for (int i = 0; i < arr[0].length; i++) {
// System.out.println(arr[0][i]);
// }
//
// //获取数据4,5,6
//// System.out.println(arr[1][0]);
//// System.out.println(arr[1][1]);
//// System.out.println(arr[1][2]);
// for (int i = 0; i < arr[1].length; i++) {
// System.out.println(arr[1][i]);
// }
//
// //获取数据7,8,9
//// System.out.println(arr[2][0]);
//// System.out.println(arr[2][1]);
//// System.out.println(arr[2][2]);
// for (int i = 0; i < arr[2].length; i++) {
// System.out.println(arr[2][i]);
// }
for (int i = 0; i < arr.length; i++) {
//arr[i]
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
在代码讲解过程中,我们讲解了循环嵌套:for循环的语句体是循环语句,这种现象被称为循环嵌套。
讲解完毕后,回到资料中我们去总结一下:
在实现的过程中,我们在二维数组中使用了循环嵌套:
① 循环嵌套:循环语句中嵌套循环语句
② 通过外层循环可以得到一维数组
③ 在通过内存循环可以得到每一个二维数组元素
好了,关于二维数组常见操作之遍历我们就先讲到这里。
讲解完毕后,大家赶快动手练习一下吧。
来,继续啊,下面我们来学习二维数组中元素打乱。
在前面呢,我们讲解过一维数组中的元素打乱,这里的思路和前面是一样的,也是要随机产生二维数组中元素的索引,并进行元素交换。
只不过呢,二维数组元素的索引是两个值,所以,这里要产生两个随机数。
知道了二维数组元素打乱的基本思路后,下面我们到IDEA中去实现一下:
xxxxxxxxxx
import java.util.Random;
/*
需求:已知二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}};用程序实现把数组中的元素打乱,并在控制台输出打乱后的数组元素
*/
public class ArrayTest02 {
public static void main(String[] args) {
//定义二维数组,并进行静态初始化
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//创建随机数对象
Random r = new Random();
//遍历二维数组,进行元素打乱
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
//arr[i][j]
int x = r.nextInt(arr.length);
int y = r.nextInt(arr[x].length);
//元素交换
int temp = arr[i][j];
arr[i][j] = arr[x][y];
arr[x][y] = temp;
}
}
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();
}
}
}
好了,关于二维数组常见操作之元素打乱我们就先讲到这里
讲解完毕后,大家赶快动手练习一下吧。
来,继续啊,下面我们来做一个案例图片展示。
关于图片展示呢?前面我们是学习过的,通过JLable组件就可以实现图片展示了。
看一下,我们这里的需求,我有很多小的图片,它们拼在一起就成了这样的一张美女美图。
下面我们要做的事情就是把这些图片一张张的给展示出来。
这里的窗体我们已经准备好了,我们要做的事情就是在窗体上显示这些图片。
下面我们到IDEA中去实现一下:
图片素材在今天的资料里面,复制到当前的模块目录下。
xxxxxxxxxx
import javax.swing.*;
/*
图片展示
*/
public class ArrayTest03 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("图片展示");
jf.setSize(380, 400);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
// JLabel jLabel1 = new JLabel(new ImageIcon("itheima-array2\\images\\1.png"));
// jLabel1.setBounds(0, 0, 90, 90);
// jf.add(jLabel1);
//
// JLabel jLabel2 = new JLabel(new ImageIcon("itheima-array2\\images\\2.png"));
// jLabel2.setBounds(90, 0, 90, 90);
// jf.add(jLabel2);
//
// JLabel jLabel3 = new JLabel(new ImageIcon("itheima-array2\\images\\3.png"));
// jLabel3.setBounds(180, 0, 90, 90);
// jf.add(jLabel3);
//
// JLabel jLabel4 = new JLabel(new ImageIcon("itheima-array2\\images\\4.png"));
// jLabel4.setBounds(270, 0, 90, 90);
// jf.add(jLabel4);
// for (int i=0; i<4; i++) {
// JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+1)+".png"));
// jLabel.setBounds(i*90,0,90,90);
// jf.add(jLabel);
// }
//
//// JLabel jLabel5 = new JLabel(new ImageIcon("itheima-array2\\images\\5.png"));
//// jLabel5.setBounds(0, 90, 90, 90);
//// jf.add(jLabel5);
////
//// JLabel jLabel6 = new JLabel(new ImageIcon("itheima-array2\\images\\6.png"));
//// jLabel6.setBounds(90, 90, 90, 90);
//// jf.add(jLabel6);
////
//// JLabel jLabel7 = new JLabel(new ImageIcon("itheima-array2\\images\\7.png"));
//// jLabel7.setBounds(180, 90, 90, 90);
//// jf.add(jLabel7);
////
//// JLabel jLabel8 = new JLabel(new ImageIcon("itheima-array2\\images\\8.png"));
//// jLabel8.setBounds(270, 90, 90, 90);
//// jf.add(jLabel8);
// for (int i=0; i<4; i++) {
// JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+5)+".png"));
// jLabel.setBounds(i*90,90,90,90);
// jf.add(jLabel);
// }
//
//// JLabel jLabel9 = new JLabel(new ImageIcon("itheima-array2\\images\\9.png"));
//// jLabel9.setBounds(0, 180, 90, 90);
//// jf.add(jLabel9);
////
//// JLabel jLabel10 = new JLabel(new ImageIcon("itheima-array2\\images\\10.png"));
//// jLabel10.setBounds(90, 180, 90, 90);
//// jf.add(jLabel10);
////
//// JLabel jLabel11 = new JLabel(new ImageIcon("itheima-array2\\images\\11.png"));
//// jLabel11.setBounds(180, 180, 90, 90);
//// jf.add(jLabel11);
////
//// JLabel jLabel12 = new JLabel(new ImageIcon("itheima-array2\\images\\12.png"));
//// jLabel12.setBounds(270, 180, 90, 90);
//// jf.add(jLabel12);
// for (int i=0; i<4; i++) {
// JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+9)+".png"));
// jLabel.setBounds(i*90,180,90,90);
// jf.add(jLabel);
// }
//
//// JLabel jLabel13 = new JLabel(new ImageIcon("itheima-array2\\images\\13.png"));
//// jLabel13.setBounds(0, 270, 90, 90);
//// jf.add(jLabel13);
////
//// JLabel jLabel14 = new JLabel(new ImageIcon("itheima-array2\\images\\14.png"));
//// jLabel14.setBounds(90, 270, 90, 90);
//// jf.add(jLabel14);
////
//// JLabel jLabel15 = new JLabel(new ImageIcon("itheima-array2\\images\\15.png"));
//// jLabel15.setBounds(180, 270, 90, 90);
//// jf.add(jLabel15);
////
//// JLabel jLabel16 = new JLabel(new ImageIcon("itheima-array2\\images\\16.png"));
//// jLabel16.setBounds(270, 270, 90, 90);
//// jf.add(jLabel16);
// for (int i=0; i<4; i++) {
// JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+13)+".png"));
// jLabel.setBounds(i*90,270,90,90);
// jf.add(jLabel);
// }
//定义图片编号的数组
int[][] datas = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
//datas[i][j]
JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+datas[i][j]+".png"));
jLabel.setBounds(j*90,i*90,90,90);
jf.add(jLabel);
}
}
jf.setVisible(true);
}
}
在代码的讲解过程中,我们先一张张的展示图片,后面通过二维数组的方式改进了图片的存储,最终优化了图片展示。
好了,关于案例图片展示我们就先讲到这里
讲解完毕后,大家赶快动手练习一下吧。
来,继续啊,下面我们来做一个案例图片打乱。
刚才我们讲解了图片展示的案例,现在呢,要在图片展示的基础上,把图片打乱,我们可以看一下打乱后的效果,其实就是对二维数组中的图片的编号打乱,然后再显示出来就可以了。
下面呢,我们到IDEA中一起去实现一下:
xxxxxxxxxx
import javax.swing.*;
import java.util.Random;
/*
图片打乱
*/
public class ArrayTest04 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("图片打乱");
jf.setSize(380, 400);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//图片打乱
int[][] datas = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
Random r = new Random();
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
int x = r.nextInt(datas.length);
int y = r.nextInt(datas[x].length);
int temp = datas[i][j];
datas[i][j] = datas[x][y];
datas[x][y] = temp;
}
}
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+datas[i][j]+".png"));
jLabel.setBounds(j*90,i*90,90,90);
jf.add(jLabel);
}
}
jf.setVisible(true);
}
}
讲解完毕后,大家赶快动手练习一下吧。