如果对象在数组中,如何将条件/ if语句写为true

时间:2013-09-20 22:45:16

标签: java arrays multidimensional-array

我想在这个条件中做的是确保数组中的对象 (中间单元格的邻居)在数组中是物理内部的,所以我想我只是让构造函数(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);
    }
}

4 个答案:

答案 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=0y=0i=-1j=-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,导致异常

你可以抓住这个例外并“吃掉/跳过”它,但这是一个坏主意