在四个方向(上,下,左,右)遍历2D阵列

时间:2015-10-11 11:15:26

标签: java arraylist

我试图创建一个遍历方形二维数组的方法,该方法接受一个指定方向的参数,向上,向下,向左或向右。我已经能够将任务分成两个单独的方法;一个用于垂直移动,另一个用于水平移动:

private void concatHorizontal(boolean left) {
        int rowIndex, columnIndex, index;
        for (int i=0; i<board.size(); i++) {
            index = (left) ? 0 : board.get(0).size()-1;

            for (int j=0; j<board.get(0).size(); j++) {
                if (left) {
                    rowIndex = i;
                    columnIndex = j;
                } else {
                    rowIndex = board.size() - 1 - i;
                    columnIndex = board.get(0).size() - 1 - j;
                }

                int val = board.get(rowIndex).get(columnIndex).getValue();
                if (val != 0) {
                    board.get(rowIndex).get(index).setValue(val);
                    if (columnIndex != index) {
                        board.get(rowIndex).get(columnIndex).setValue(0);
                    }
                    index = (left) ? index+1 : index-1;
                }
            }
        }
    }

    private void concatVertical(boolean up) {
        int rowIndex, columnIndex, index;
        for (int i=0; i<board.get(0).size(); i++) {
            index = (up) ? 0 : board.size()-1;

            for (int j=0; j<board.size(); j++) {
                if (up) {
                    columnIndex = i;
                    rowIndex = j;
                } else {
                    columnIndex = board.get(0).size() - 1 - i;
                    rowIndex = board.size() - 1 - j;
                }

                int val = board.get(rowIndex).get(columnIndex).getValue();
                if (val != 0) {
                    board.get(index).get(columnIndex).setValue(val);
                    if (rowIndex != index) {
                        board.get(rowIndex).get(columnIndex).setValue(0);
                    }
                    index = (up) ? index+1 : index-1;
                }
            }
        }
    }

这些方法在给定方向上尽可能地将数组中的所有值移动不等于零,如game 2048但不合并具有相同值的邻居。

正如您所看到的,我的代码既不直观也不紧凑,如果可能的话,我想将上述两种方法合并为一种。换句话说,它应该像下面的一个for循环一样遍历arraylist,具体取决于给定的方向。

        for (int i=0; i<board.size(); i++) {
            for (int j=0; j<board.get(0).size(); j++) {
                // Traverse to the right
            }
        }

        for (int i=0; i<board.size(); i++) {
            for (int j=board.get(0).size()-1; j>=0; j--) {
                // Traverse to the left
            }
        }

        for (int i=0; i<board.get(0).size(); i++) {
            for (int j=0; j<board.size(); j++) {
                // Traverse downwards
            }
        }

        for (int i=0; i<board.get(0).size(); i++) {
            for (int j=board.size()-1; j>=0; j--) {
                // Traverse upwards
            }
        }

1 个答案:

答案 0 :(得分:2)

这是解决方案的一步(简化了对元素值的访问):

private void concatHori(boolean left) {
    if( left ){
        concatHori( 0, 0, 1 );
    } else {
        concatHori( board.size()-1, board.get(0).size()-1, -1 );
    }
}

private void concatHori(int rowstart, int colstart, int inc ) {
    for (int i=0; i<board.size(); i++) {
        int index = colstart;
        for (int j=0; j<board.get(0).size(); j++) {
            int rowIndex = rowstart + inc*i;
            int colIndex = colstart + inc*j;
            int val = board.get(rowIndex).get(colIndex);
            if (val != 0) {
                board.get(rowIndex).set(index, val);
                if (colIndex != index) {
                    board.get(rowIndex).set(colIndex, 0);
                }
                index += inc;
            }
        }
    }
}

&#34;垂直&#34;方法可以用同样的方式转换。

第二步是水平和垂直的结合,这可以通过为 - 然后 - 单一方法提供访问功能来完成。但我认为生成的代码会比现在的代码更多,更直观,因此我不会添加第2步。