详析二维数组

二维数组实质是行数个一维数组的拼接

创建二维数组

数据类型[][] 数组名; 
数据类型 数组名[][];

初始化二维数组

//以数据类型为Int型为例
第一种:
int[][] arr = new int[行数][列数];
第二种:
int[][] arr = {{1,2,3},
			   {4,5,6},
			   {7,8,9}};


int[][] arr = new int[3][];//这里数组长度没有,
//null调任何东西都会抛出空指针异常
System.out.println(arr);    //栈内是门牌号,也就是数组名的地址
System.out.println(arr[1][0]);//NullPointerException空指针异常
System.out.println(arr[0]); //null
//动态的为每一个一维数组分配空间
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];

获取二维数组元素值

//二维数组行、列的下标同一维数组一样也是从0开始

//获取单个元素值
arr[0][2];//表示获取二维数组第一行第三列的数据

//遍历打印二维数组
1.第一种方法:使用for i循环,通过拿下标值来遍历数组
for(int i = 0; i < arr.length; i++){//遍历行
	for(int j = 0; j < arr[i].length; j++){//遍历列
		System.out.println(arr[i][j]);
	}
}
2.第二种方法:使用for each循环,遍历数组
   	 *   (1) 外层第一次循环,从数组中获取第0行 赋值给变量
   	 		  内存第一圈循环,从数组中获取第0行所有列的元素值
   	 *   (2) 外层第二次循环,从数组中获取第1行 赋值给变量
   	 		  内存第一圈循环,从数组中获取第1行所有列的元素值
for(int[] row : arr){//拿到每一行
	for(int line : row){//拿到当前行的每一列,其实就是一位数组的遍历
		System.out.println(line);
	}
}

//获取整行元素
int[][] arr = {{1,2,3},
			   {4,5,6},
			   {7,8,9}}
Scanner scanner = new Scanner(System.in);
System.out.println("当前数组只有" + arr.length + "行,请输入你要获取的行号:");
int num = scan.nextInt();//获取从控制台输入的行号
for (int j = 0; j < arr[number - 1].length; j++) {//行号固定,遍历列
	System.out.println("第" + number + "行的第[" + j + "]个元素的值是:" + arr[num - 1][j]);
 }


//获取整列元素
int[][] arr = {{1,2,3},
			   {4,5,6},
			   {7,8,9}}
Scanner scanner = new Scanner(System.in);
System.out.println("当前数组只有" + arr[0].length + "列,请输入你要获取的列号:");
int num = scan.nextInt();//获取从控制台输入的列号
for (int i = 0; i < arr.length; i++) {
    System.out.println("第 "+(i + 1)+"行的第["+ num +"]个元素的值是" + arr[i][num]);
}

求两个矩阵乘积

第一个矩阵的列一定和第二个矩阵的行一样,如一个2x3的矩阵乘以一个3x4的矩阵,会得到一个2x4的矩阵

		int[][] arr1 = {{1,2,3},{4,5,6}};//2*3的矩阵
		int[][] arr2 = {{1,2,3,5},{2,4,6,8},{1,2,3,4}};//3*4的矩阵
		int[][] arr = new int[arr1.length][arr2[0].length];
		//arr1 * arr2 会得到一个 2*4的新矩阵
		for (int i = 0; i < arr1.length; i++) {//arr1的行
			for (int j = 0; j < arr1[i].length; j++) {//arr1的列
				for(int k = 0; k < arr2[i].length; k++) {
					arr[i][k] = arr[i][k] + arr1[i][j] * arr2[j][k];
				}	
			}
		}
		for(int i = 0; i < arr.length; i++){//遍历行
			for(int j = 0; j < arr[i].length; j++){//遍历列
				System.out.println(arr[i][j]);
			}
		}

求矩阵行之和

		int[][] arr = {{1,2,3,5},{2,4,6,8},{1,2,3,4}};//3*4的矩阵
		for(int i = 0; i < arr.length; i++) {
			int sum = 0;
			for(int j = 0; j < arr[i].length; j++) {
				sum = sum + arr[i][j];
			}
			System.out.println("第" + (i + 1) + "行的和为" + sum);
		}

求矩阵列之和(只适合n * n 矩阵)

		int[][] arr = {{1,2,3,4},{2,4,6,8},{1,2,3,4}};//3*4的矩阵
		for(int i = 0; i < arr[0].length; i++) {
			int sum = 0;
			for(int j = 0; j < arr.length; j++) {
				sum = sum + arr[j][i];
			}
			System.out.println("第" + (i + 1) + "列的和为" + sum);
		}

求主对角形之和(只适合n * n 矩阵)

		int[][] arr = {{1,2,3,4},{2,4,6,8},{1,2,3,4},{1,2,3,4}};//3*4的矩阵
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
		for(int j = 0; j < arr[i].length; j++) {
			if(i == j) {
				sum = sum + arr[i][j];
			}		   
		}
	}
		System.out.println(sum);

求副对角形之和(只适合n * n 矩阵)

		int[][] arr = {{1,2,3,4},{2,4,6,8},{1,2,3,4},{1,2,3,4}};//3*4的矩阵
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
		for(int j = 0; j < arr[i].length; j++) {
			if(i + j == arr.length) {
				sum = sum + arr[i][j];
			}		   
		}
	}
		System.out.println(sum);

二维数组实现开关游戏

从控制台输入一个位置,那么这个位置及其上下左右位置都变成它相反的数字(0或者1)

package demo;

import java.util.Scanner;

/**
 * 开关游戏
 *  两个想法: 
 *  1.不创建新数组,但需要限制执行条件,最后打印原数组
 *  2.创建一个比旧数组大一周的新数组,不需要限制执行条件,但是需要调整控制台输入的行列号,最后截取打印新数组
 * @author Amid
 *
 */
public class Test_06 {
	static Scanner scanner = new Scanner(System.in);

	public static void main(String[] args) {
		int[][] arr = new int[5][5];
		int[][] arrNew = new int[arr.length + 2][arr[0].length + 2];
		while (true) {
			System.out.println("请输入行");
			int num1 = scanner.nextInt();
			System.out.println("请输入列");
			int num2 = scanner.nextInt();
			if ((!(num1 >= 0 && num1 < arr.length)) || (!(num2 >= 0 && num1 < arr[0].length))) {
				System.out.println("你输入的位置不正确,请重新输入");
				continue;
			}
			//openAndClose1(arr, num1, num2);
			openAndClose2(arrNew, num1, num2);
		}

	}

	/*
	 * 1. 不创建新数组,但需要限制进入条件,最后打印原数组
	 */
	static void openAndClose1(int[][] arr, int num1, int num2) {
		// 当前位置,所有都能进
		if (arr[num1][num2] == 0) {
			arr[num1][num2] = 1;
		} else {
			arr[num1][num2] = 0;
		}

		// 上 ,最上一排不能进
		if (!(num1 == 0)) {
			if (arr[num1 - 1][num2] == 0) {
				arr[num1 - 1][num2] = 1;
			} else {
				arr[num1 - 1][num2] = 0;
			}
		}

		// 下 ,最下一排不能进
		if (!(num1 == arr.length - 1)) {
			if (arr[num1 + 1][num2] == 0) {
				arr[num1 + 1][num2] = 1;
			} else {
				arr[num1 + 1][num2] = 0;
			}
		}

		// 左 ,最左一列不能进
		if (!(num2 == 0)) {
			if (arr[num1][num2 - 1] == 0) {
				arr[num1][num2 - 1] = 1;
			} else {
				arr[num1][num2 - 1] = 0;
			}
		}

		// 右 ,最右一列不能进
		if (!(num2 == arr[0].length - 1)) {
			if (arr[num1][num2 + 1] == 0) {
				arr[num1][num2 + 1] = 1;
			} else {
				arr[num1][num2 + 1] = 0;
			}
		}

		// 遍历打印二维数组
		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();
		}

	}

	/*
	 * 2. 创建一个比旧数组大一周的新数组,不需要限制进入条件,但是需要调整控制台输入的行列号,最后截取打印新数组
	 */
	static void openAndClose2(int[][] arrNew, int num1, int num2) {
	
		// 原数组的当前位置
		if (arrNew[num1 + 1][num2 + 1] == 0) {
			arrNew[num1 + 1][num2 + 1] = 1;
		} else {
			arrNew[num1 + 1][num2 + 1] = 0;
		}

		// 上

		if (arrNew[num1 + 1 - 1][num2 + 1] == 0) {
			arrNew[num1 + 1 - 1][num2 + 1] = 1;
		} else {
			arrNew[num1 + 1 - 1][num2 + 1] = 0;
		}

		// 下

		if (arrNew[num1 + 1 + 1][num2 + 1] == 0) {
			arrNew[num1 + 1 + 1][num2 + 1] = 1;
		} else {
			arrNew[num1 + 1 + 1][num2 + 1] = 0;
		}

		// 左

		if (arrNew[num1 + 1][num2 + 1 - 1] == 0) {
			arrNew[num1 + 1][num2 + 1 - 1] = 1;
		} else {
			arrNew[num1 + 1][num2 + 1 - 1] = 0;
		}

		// 右

		if (arrNew[num1 + 1][num2 + 1 + 1] == 0) {
			arrNew[num1 + 1][num2 + 1 + 1] = 1;
		} else {
			arrNew[num1 + 1][num2 + 1 + 1] = 0;
		}

		// 遍历打印二维数组
		for (int i = 1; i < arrNew.length - 1; i++) {
			for (int j = 1; j < arrNew[i].length - 1; j++) {
				System.out.print(arrNew[i][j] + " ");
			}
			System.out.println();
		}
	}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值