二维数组
快速入门
请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0
代码如下:
package ArrayList_Practice;
public class TwoDimensionalArray01 {
public static void main(String[] args) {
int arr[][] = {{0,0,0,0,0,0},{0,0,1,0,0,0},
{0,2,0,3,0,0},{0,0,0,0,0,0} };
System.out.println("矩阵如下");
//输出二维图形
for (int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
//遍历二维数组的每个元素(元素)
//1.arr[i] 表示二维数组的第一个元素,二维数组每个元素又是一个一维数组
//2.arr[i].length 得到二维数组每个一维数组的长度
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();//换行
}
}
}
运行图:
一、相关概念
定义:
-
形式上看int[][]
-
原来的一维数组的每个元素是一维数组,就构成二维数组
-
二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值,还需要再次遍历
-
统计二维数组有多少个元素(数组)
使用:System.out.println("二维数组的元素个数:"+ arr.length); 进行统计
5.如果我们要访问第 (i+1)个一维数组的第j+1个值
System.out.println(arr[2][3]);
二、动态初始化
2.1动态初始化的各种方法
方法一
语法: 类型 [][] 数组名=new 类型[大小][大小]
- 第一个[]表示有几个一维数组
- 第二个[]表示这个一维数组中有几个元素
比如: int a[][]=new int[2][3]
方法二
-
先声明:类型 数组名[][];
-
再定义(开辟空间) 数组名 = new 类型[ 大小][大小]
-
赋值(有默认值,比如 int 类型的就是0)
package TwoDimenSionalArray;
public class TowDimensionalArray01 {
public static void main(String[] args) {
// int arr[][] = new int[2][3];
int arr[][];
arr = new int[2][3];
//遍历arr数组
arr[1][1] = 8;
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();
}
}
}
方法三
动态初始化-列数不确定
/*
看一个需求:动态创建下面二维数组,并输出
i = 0: 1
i = 1: 2 2
i = 2: 3 3 3 一个有三个一维数组, 每个一维数组的元素是不一样的
*/
int arr[][] = new int[3][];//列数不确定,这里只是确定一维数组的空间,不同于c语言,c语言只能行数不确定
//遍历arr的每个一维数组
for (int i = 0; i < arr.length; i++) {
//给每个一维数组开空间, new
//如果没有给一维数组 new , 那么 arr[i]就是null
arr[i] = new int[i+1];
//遍历一维数组,并给一维数组的每个元素赋值
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = i+1;
}
}
//遍历
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();
}
个人理解:
- int arr[][] = new int[3][];只是声明了二维数组中,包含的一维数组个数,但每个元素由于没有开辟空间,所以是NULL指针
- 开辟空间,是让 arr数组指向一个能存放i+1个int 的空间,这样一维数组就能有地址了
运行效果:
方法四
定义 类型 数组名[][] = {{值 1,值 2..},{值 1,值 2..}
比如
int[][] arr = {{1,1,1}, {8,8,9},{100}}
1.定义了一个二维数组 arr
2.arr数组中有三个元素,第二个一维数组有3个元素,第三个一维素组有1个元素
package TwoDimenSionalArray;
public class TwoDimensionalArray02 {
public static void main (String [] args) {
//遍历该数组,并得到它的和
int arr[][] = {{4,6},{1,4,5,7},{-2}};
int sum = 0;
System.out.println("====arr数组元素====");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println("各元素的和:"+sum);
}
}
运行结果:
====arr数组元素====
4 6
1 4 5 7
-2
各元素的和:25
2.2二维数组在内存中的形式
注意:
- 在java里面如果没有给数组赋值,它由默认值,int 为 0,区别于c语言
2.3注意事项和使用细节
-
一维数组的声明方式有
int[]x 或者 int x[]
-
二维数组的声明方式有:
int[][]y 或者 int[]y[] 或者 int y[][]
-
二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同
三、练习
3.1杨辉三角
package TwoDimenSionalArray;
public class YangHui {
public static void main(String[] args) {
/*
* 杨慧三角
* 使用二维数组打印一个 10 行杨辉三
* 1
* 1 1
* 1 2 1
* 1 3 3 1
* 1 4 6 4 1
* 1 5 10 10 5 1
*
* 规律
* 1.第一行有 1 个元素, 第 n 行有 n 个元素
* 2. 每一行的第一个元素和最后一个元素都是 1
* 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值.
*/
int yangHui[][] = new int[12][];
System.out.println("===杨辉三角如下===");
for (int i = 0; i < yangHui.length; i++) {
//给每个一维数组(行)开辟空间,
yangHui[i] = new int[i+1];
//给每一个一维数组(行)赋值
for (int j = 0; j < yangHui[i].length; j++) {
//第一个和最后一个赋值为1
if( j == 0 || j == yangHui[i].length -1) {
yangHui[i][j] = 1;
}else {
//不是第一个也不是最后一个,那么就把i-1 行 第j列 和i-1 行 第 j-1列 的值加起来
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
}
}
}
for (int i = 0; i < yangHui.length; i++) {
for (int j = 0; j < yangHui[i].length; j++) {
System.out.print(yangHui[i][j]+" ");
}
System.out.println();
}
}
}
运行效果:
3.2客观题
3.3插入
题目:已知一个升序序列要求插入一个元素,该数组依然是升序
package TwoArrayHomeWroks;
import java.util.Iterator;
public class Homework04 {
public static void main(String[] args) {
//已知一个升序的数组,要求插入一个元素,该数组是升序
int[] array = { 10, 12, 45, 90 };
int[] newArray = new int[array.length + 1];
int key = 0;
int temp = 0;
int index = 0;
System.out.println("====插入之前====");
//插入之前
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] +" ");
}
//确定要插入的下标
for (int i = 0; i < array.length; i++) {
if( array[i]>= key) {
index = i;
break;
}
if(i == array.length-1 && index == 0){
index = array.length;
}
}
//进行插入,利用两个数组
for (int i = 0, j = 0; i < newArray.length; i++) {
if( i== index) {
newArray[i] = key;
}else {
newArray[i] = array[j];
j++;
}
}
System.out.println("\n====插入之后====");
for (int i = 0; i < newArray.length; i++) {
System.out.print(newArray[i]+" ");
}
}
}
3.4最大值最小值
题目:
- 随机生成10个整数(1~100)保存到数组,并逆序打印,求平均值,最大值的下标,最小值的下标,并查找里面是否有8
package TwoArrayHomeWroks;
import java.util.Random;
public class Homework05 {
public static void main(String[] args) {
double average = 0;
int sum = 0;
int max = 0;
int min = 0;
int key = 8;
int arr[] = new int[10];
boolean flag = false;
//正序打印
System.out.println("====正序打印====");
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
int temp = random.nextInt(100);
arr[i] = temp;
//打印
System.out.print(arr[i] + " ");
sum += temp;
if(temp == key) {
flag = true;
}
}
average = sum*1.0/ arr.length;
//逆序打印
System.out.println("\n====逆序打印====");
for(int i = arr.length - 1 ; i >= 0 ; i--) {
System.out.print(arr[i] + " ");
}
//找到最小值 和最大值的下标
for (int i = 0; i < arr.length; i++) {
if(arr[max] < arr[i]){
max = i;
}
if(arr[min] > arr[i]) {
min = i;
}
}
System.out.println("\n平均值为:" + average);
System.out.println("最大值下标" + max);
System.out.println("最小值下标" + min);
System.out.print("是否有8:");
if(flag) {
System.out.print("是");
}else {
System.out.println("否");
}
}
}