我想检查我的two-dimensional
数组的每个位置附近的第8个位置,但是第一个位置给我错误,因为那里没有位置。
如何避免该错误?我过去也发生过同样的事情,我也无法解决这个问题。
我想要做的示例图片:
我的方法代码:
private static void evoluciona(char[][] tauler2, char[][] tauler22) {
for(int i = 0; i < files; i++) {
for(int j = 0; j < columnes; j++) {
tauler2[i][j] = tauler[i][j];
}
}
for(int i = 0; i < files; i++) {
for(int j = 0; j < columnes; j++) {
if(tauler2[i][j] == 'x') {
int cont = 0;
if(tauler2[i-1][j] == '*') {
cont++;
}
if(tauler2[i-1][j-1] == '*') {
cont++;
}
if(tauler2[i-1][j+1] == '*') {
cont++;
}
if(tauler2[i][j-1] == '*') {
cont++;
}
if(tauler2[i+1][j-1] == '*') {
cont++;
}
if(tauler2[i+1][j] == '*') {
cont++;
}
if(tauler2[i+1][j+1] == '*') {
cont++;
}
if(tauler2[i][j+1] == '*') {
cont++;
}
if(cont == 2 || cont == 3) {
tauler2[i][j] = '*';
}
}
else if(tauler2[i][j] == '*') {
int cont = 0;
if(tauler2[i-1][j] == '*') {
cont++;
}
if(tauler2[i-1][j-1] == '*') {
cont++;
}
if(tauler2[i-1][j+1] == '*') {
cont++;
}
if(tauler2[i][j-1] == '*') {
cont++;
}
if(tauler2[i+1][j-1] == '*') {
cont++;
}
if(tauler2[i+1][j] == '*') {
cont++;
}
if(tauler2[i+1][j+1] == '*') {
cont++;
}
if(tauler2[i][j+1] == '*') {
cont++;
}
if(cont == 2 || cont == 3) {
tauler2[i][j] = '*';
}
else {
tauler2[i][j] = 'x';
}
}
}
}
}
答案 0 :(得分:2)
在圣诞节期间编写我自己的小扫雷克隆时,我遇到了类似的问题。
我最终得到了一个了解其邻居的字段类。
class Field {
char value;
Field[] neighbors;
}
每当初始化一块新板时,那些“连接”都是预编译的。
class FieldManager {
void initializeFields(int firstDimension, int secondDimension) {
fields = new Field[firstDimension][secondDimension];
for(int i = 0; i < fields.length; i++) {
for(int j = 0; j < fields[i].length; j++) {
fields[i][j] = new Field();
fields[i][j].neighbors = neighborsFor(i, j);
}
}
}
private Field[] neighborsFor(int iIn, int jIn) {
List<Field> result = new ArrayList<>();
for(int i = iIn - 1; i <= iIn + 1; i++) {
for(int j = jIn - 1; j < jIn + 1; j++)
// do some range checks and fill result
}
}
return result.toArray(new Field[result.size()]);
}
Field[][] fields;
}
您可以使用Collection
来代替数组,例如ArrayList
。特别是较新的java版本具有围绕这些接口构建的许多有用的实用程序。
答案 1 :(得分:1)
我建议明确检查边界!
修改你的if语句,这样每当你有i+1
,j+1
,你就检查它是不是太大(i < files
和j < columnes
),{{1} },i-1
他们不是0(j-1
和i > 0
)。
当你计算邻近的星星时,如果你在边境,这种方法不会增加额外的星星。
或者,&#34;懒惰的方式&#34;,你可以在内循环内j > 0
!
答案 2 :(得分:1)
在所有索引为i-1或j-1的地方,在任一循环(i或j)的第一次迭代中,根据堆栈跟踪中的异常,您可以得到-1的索引,这会导致try{} catch(ArrayOutOfBoundsException e) { continue; }
。
不要抓住它并忽略它,在做任何事之前在可能导致此异常的区域周围放置一个if。
ArrayIndexOutOfBoundsException
同样在// your code
...
if (i - 1 >= 0) {
if(tauler2[i-1][j] == '*') {
cont++;
}
}
...
的情况下,对tauler2[i][j-1]
进行条件检查。
答案 3 :(得分:1)
您正在访问不在数组中的索引。当你开始forloops i-e i = 0和j = 0时,如果条件u r使用索引为[i-1]和[j-1]。在这里你得到索引越界的例外。消除或改变这些条件。