我想在这个条件中做的是确保数组中的对象 (中间单元格的邻居)在数组中是物理内部的,所以我想我只是让构造函数(age)中的第三个变量等于零,认为如果它找不到该实例变量就不会更进一步。但它给了我一个超出范围的-1例外,我不知道如何重写以避免这种情况。 (如果这个细节不够,我会道歉,我可以提供更多,只要问一下)
所以我的代码中的一部分我坚持:
for (int x = 0; x < Grid.columns; x++) {
for (int y = 0; y < Grid.rows; y++) {
int nCount = 0;
int hCount = 0;
//check neighbors
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
//check if valid and identity
//STUCK HERE---> if(i !=0 && j !=0)
if (board[x + i][y + j].age == 0) {
nCount++;
if (board[x + i][y + j].getPreviousValue() == 0)
hCount++;
}
}
}
board[x][y].setCurrentValue(hCount / nCount, (nCount - hCount) / nCount);
}
}
答案 0 :(得分:3)
您的问题是网格的“边缘单元”,因为您访问数组外的索引。 (如-1和array.length)。要获得完善的解决方案,您必须检查这些条件。
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int neighbor_x = x + i;
int neighbor_y = y + j;
if (neighbor_x < 0 || neighbor_x >= board.length) {
// Out of Grid
}
if (neighbor_y < 0 || neighbor_y >= board[neighbor_x].length) {
// Out of Grid
}
if (board[neighbor_x][neighbor_y].age == 0) {
nCount++;
if (board[x + i][y + j].getPreviousValue() == 0)
hCount++;
}
}
}
另一种可能性是简单地捕获异常。但是,这可以被认为是不好的风格。我不建议使用此代码:
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
try {
if (board[x + i][y + j].age == 0) {
nCount++;
if (board[x + i][y + j].getPreviousValue() == 0)
hCount++;
}
}
} catch (IndexOutOfBoundsException e) {
// Here you know that the exception occured.
//
// In this particular case we will not write any code,
// since the proper handling of this exception is to move
// on to the next cell.
}
}
}
并且作为一种评论:风格总是主观的,但是6级嵌套通常不是很好。
答案 1 :(得分:2)
在你的情况下,你不能拥有负值的数组-1。数组从0开始,因此i
等于-1&amp; j
等于-1,您将收到该错误。您正在添加-1到0,因此为您的数组选择获得-1。保持数字正面。
我也不确定你在这里要做什么。我的意思是如果元素不在数组中,该元素还会在哪里?如果您想知道该项是否在数组中,可以使用数组方法来查看特定值是否在数组中。如果你试图确定某个特定值是否存在,那么这就是一件事,我只是不清楚你想要做什么。
答案 2 :(得分:1)
我的建议是做一些边界检查。
使用您的示例,第一次在第四个(!)for循环中,您有x=0
,y=0
,i=-1
和j=-1
。这意味着您正在尝试访问board[-1][-1]
,这显然不存在。解决此问题的一种(不一定是最优的)方法是使用另一个if
语句来检查越界条件,例如if ((x+i) >= 0) && ((x+1) < Grid.columns) && ((y+j) >= 0 && (y+j) < Grid.Rows)
。
问题不在于if(i !=0 && j !=0)
部分..这是因为你的索引越界了。
另外,正如评论和其他答案中所提到的那样,拥有第四个嵌套for
循环并不是一个好主意,并且很容易导致内存或运行时性能问题。在这种特殊情况下,由于您使用第三个和第四个嵌套for循环检查最多八个点(如果取消注释!=0
if语句,则为四个),您可以尝试实际枚举那八个(或四个)。
另外,如果你有嵌套的if
语句,就像这样:
if(test1)
if(test2)
doSomething();
然后你可以尝试将它们组合成一个if语句:
if(test1 && test2)
doSomething();
这并不总是有效(else
语句会浮现在脑海中),但它可以帮助您使代码可读。
答案 3 :(得分:0)
有了所有这些复杂的代码,我觉得我无法理解究竟是什么,我理解的是你想要在第二维中处理数组中的对象,你可以这样做:
int[][][] ints = {
{{1,2,3},{4,5,6}}, // dimension 0
{{},{},{7,8,9}} // dimension 1
};
for(int i = 0;i<ints.length;i++){
for(int t = 0;t<ints[i].length;t++){
// check if the middle Dimension array is initialized
if((ints[i][t] != null) && ints[i][t].length > 0){
for(int z = 0;z<ints[i][t].length;z++){
System.out.println("Dimension "+i+"-"+t+" : "+ints[i][t][z]);
}
}
}
}
/* Result
Dimension 0-0 : 1
Dimension 0-0 : 2
Dimension 0-0 : 3
Dimension 0-1 : 4
Dimension 0-1 : 5
Dimension 0-1 : 6
Dimension 1-2 : 7 // skipped the empty dimentions 1-0,1-1
Dimension 1-2 : 8
Dimension 1-2 : 9
*/
但是一条建议,我认为以-1开始你的循环是这个的原因...请尝试以“0”开始你的for循环...你的代码试图找到一个索引元素数组中的-1,导致异常
你可以抓住这个例外并“吃掉/跳过”它,但这是一个坏主意