今天学习回形数,在网上看了别人的代码后试着按自己的理解敲了一遍
package exercise;
import java.util.Scanner;
/**
* @author lzy
* 数组算法
* 回形数,也称回形矩阵
*/
public class RoundMatrix {
/**
* 定义常量代表含义
* 初始向右,设置RIGHT = 1
*/
private static final int RIGHT = 1;
private static final int DOWN = 2;
private static final int LEFT = 3;
private static final int UP = 4;
public static void main(String[] args) {
//1.创建数组
//根据键盘输入num值决定回型矩阵的行数列数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字:");
int num = scanner.nextInt();
int[][] roundMatrix = new int[num][num];
//表示该矩阵元素的总数目
int count = num * num;
//2.赋值
//定义横纵坐标,方向,循环次数计数器
int xAis = 0;
int yAis = 0;
int direction = RIGHT;
int recycleNumber;
for (recycleNumber = 1; recycleNumber <= count; recycleNumber ++){
//方向向右时的处理
switch (direction) {
case RIGHT:
if (roundMatrix[xAis][yAis] == 0 && yAis < num) {
roundMatrix[xAis][yAis] = recycleNumber;
yAis ++;
} else {
direction = DOWN;
xAis++;
yAis--;
//进入else的recycleNumber需减1,保证下次循环时的值正确
recycleNumber--;
}
break;
//方向向下时的处理
case DOWN:
if (roundMatrix[xAis][yAis] == 0 && xAis < num) {
roundMatrix[xAis][yAis] = recycleNumber;
xAis ++;
} else {
direction = LEFT;
xAis--;
yAis--;
recycleNumber--;
}
break;
//方向向左时的处理
case LEFT:
if (roundMatrix[xAis][yAis] == 0 && yAis >= 0) {
roundMatrix[xAis][yAis] = recycleNumber;
yAis --;
} else {
direction = UP;
xAis--;
yAis++;
recycleNumber--;
}
break;
//向上
case UP:
if (roundMatrix[xAis][yAis] == 0 && xAis >= 0) {
roundMatrix[xAis][yAis] = recycleNumber;
xAis --;
} else {
direction = RIGHT;
xAis++;
yAis++;
recycleNumber--;
}
break;
default:
}
}
//3.遍历
for (int[] matrix : roundMatrix) {
for (int i : matrix) {
System.out.print(i + " ");
}
System.out.println();
}
}
}
写完后运行,但是却一直报错,显示数组越界异常,不明白为什么
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at exercise.RoundMatrix.main(RoundMatrix.java:40)
最后把每条case语句中第一个if语句中 && 前后两个条件的顺序替换了才运行成功,虽然没再报错了,但一直不明白为什么颠倒了顺序后就会数组越界
case RIGHT:
if (yAis < num && roundMatrix[xAis][yAis] == 0)
判断先后顺序肯定有关系。&&的意思是满足条件一才执行条件二,如果条件1不满足则不会执行条件2。拿你的问题来说,只有索引位置满足条件的时候,才会去进一步比较索引位置对应的值。否则,先取值的话,可能你的索引位置不满足要求,被用来取值了,导致数组越界异常。
看具体情况,当存在多个条件时,先判断第一个,如果第一个成立才会进行后面的判断。如果条件之间互不影响,那么顺序可以改变,比如x>1&&x<10,这种互换没有影响。但是如果条件之间有关联就有影响,比如有一个结构体指针p,结构体中有个元素a,如果在条件中是: p!=0 && p->a > 10,那么这个就是不能互换的,如果换了,当p为空时就会崩溃。同理,数组下标判断是否越界也必须在用在数组使用之前。
&& 是条件必须满足 并且只有在第一个为true时才会执行第二个 都为true才会进if,之所以报下标越是因为你没有判断长度直接去取对应的下标,应该是你判断长度为true对应下标才有值 否则就会出现下标越界 对于判断条件来说一般把可能为空,或者也许操作会报错的条件都放在后面,比如传进一个字符串 判断为不为null或者空串,第一个条件肯定不可能直接判断为不为空串 即便是"".equals(),如果值为null你也是会报错,只有字符串不为null或者是你的数组对应下标有长度或者有值时你才可以去操作
如果判断条件修改为 if ( yAis < num && roundMatrix[xAis][yAis] == 0) :就不会抛数组越界的异常