Java 二维数组

二维数组

快速入门

请用二维数组输出如下图形

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();//换行
		}
	}
}

运行图:

image-20220108153032994

一、相关概念

定义:

  1. 形式上看int[][]

  2. 原来的一维数组的每个元素是一维数组,就构成二维数组

  3. 二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值,还需要再次遍历

  4. 统计二维数组有多少个元素(数组)

    使用: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]

方法二

  1. 先声明:类型 数组名[][];

  2. 再定义(开辟空间) 数组名 = new 类型[ 大小][大小]

  3. 赋值(有默认值,比如 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();
		}

个人理解:

  1. int arr[][] = new int[3][];只是声明了二维数组中,包含的一维数组个数,但每个元素由于没有开辟空间,所以是NULL指针
  2. 开辟空间,是让 arr数组指向一个能存放i+1个int 的空间,这样一维数组就能有地址了

运行效果:

image-20220108162131695

方法四

定义 类型 数组名[][] = {{值 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二维数组在内存中的形式

image-20220108155719675

注意:

  1. 在java里面如果没有给数组赋值,它由默认值,int 为 0,区别于c语言

2.3注意事项和使用细节

  1. 一维数组的声明方式有

    int[]x 或者 int x[]
    
  2. 二维数组的声明方式有:

    int[][]y 或者 int[]y[] 或者 int y[][]
    
  3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同

三、练习

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();
		}
		
	}
}

运行效果:

image-20220109212407578

3.2客观题

image-20220108203953107

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("否");
			}
		}
}

原文地址:https://www.cnblogs.com/DL50/p/15782362.html