Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使if语句更小,避免在java中为同一原因使用过多的循环_Java_Performance - Fatal编程技术网

如何使if语句更小,避免在java中为同一原因使用过多的循环

如何使if语句更小,避免在java中为同一原因使用过多的循环,java,performance,Java,Performance,此代码用于我的一项作业(连接四项)。我需要使这段代码少于25行,并且使“if”语句更短。此外,电路板有6行7列。我的代码试图找出是否有人赢了 我试图将所有的循环合并成一个循环,但这并没有给我一个正确的答案 public static boolean determineWin(String[][] board) { boolean won = false; for (int i = 0; i < 6; i++) { for (int j = 0; j <

此代码用于我的一项作业(连接四项)。我需要使这段代码少于25行,并且使“if”语句更短。此外,电路板有6行7列。我的代码试图找出是否有人赢了

我试图将所有的循环合并成一个循环,但这并没有给我一个正确的答案

public static boolean determineWin(String[][] board) {
    boolean won = false;

    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i][j+1]) && board[i][j+1].equals(board[i][j+2]) && board[i][j+2].equals(board[i][j+3])) {
                    won = true;
                    break;
                }
            }
        }
    }

    for (int i = 5; i > 2; i--) {
        for (int j = 6; j > 2; j--) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j-1]) && board[i-1][j-1].equals(board[i-2][j-2]) && board[i-2][j-2].equals(board[i-3][j-3])){
                    won = true;
                    break;
                }
            }
        }

        for (int j = 0; j < 4; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j+1]) && board[i-1][j+1].equals(board[i-2][j+2]) && board[i-2][j+2].equals(board[i-3][j+3])){
                    won = true;
                    break;
                }
            }
        }

        for (int j = 0; j < 7; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j]) && board[i-1][j].equals(board[i-2][j]) && board[i-2][j].equals(board[i-3][j])){
                    won = true;
                    break;
                }
            }
        }
    }

    return won;
}
publicstaticboolean determinatewin(字符串[][]板){
布尔值=false;
对于(int i=0;i<6;i++){
对于(int j=0;j<4;j++){
如果(董事会[i][j]!=”){
如果(董事会[i][j].等于(董事会[i][j+1])和董事会[i][j+1].等于(董事会[i][j+2])和董事会[i][j+2].等于(董事会[i][j+3])){
韩元=真;
打破
}
}
}
}
对于(int i=5;i>2;i--){
对于(int j=6;j>2;j--){
如果(董事会[i][j]!=”){
如果(董事会[i][j]。等于(董事会[i-1][j-1])和董事会[i-1][j-1]。等于(董事会[i-2][j-2])和董事会[i-2][j-2]。等于(董事会[i-3][j-3])){
韩元=真;
打破
}
}
}
对于(int j=0;j<4;j++){
如果(董事会[i][j]!=”){
如果(董事会[i][j]。等于(董事会[i-1][j+1])和董事会[i-1][j+1]。等于(董事会[i-2][j+2])和董事会[i-2][j+2]。等于(董事会[i-3][j+3])){
韩元=真;
打破
}
}
}
对于(int j=0;j<7;j++){
如果(董事会[i][j]!=”){
如果(董事会[i][j]。等于(董事会[i-1][j])和董事会[i-1][j]。等于(董事会[i-2][j])和董事会[i-2][j]。等于(董事会[i-3][j])){
韩元=真;
打破
}
}
}
}
赢回;
}

结果应该与上面的代码相同,但我只需要代码稍微小一点(25行)并且if语句要短一点。

上面的代码效率很低,因为它有4个独立的
循环(跟踪你可以赢的4个方向:1)从左到右,2)从上到下,3)对角线4)对角线/其他方向-和-因为
if
语句必须检查4个连续位置。

要优化解决方案,您可以认识到,您可以保持
状态
,用于
板中每个位置的连续相同块数
,用于您可以赢得的4个可能方向中的每个方向(4个唯一状态)。

以水平方向获胜为例。当您沿着同一行从左向右移动时,如果左侧的工件相同,状态计数器将增加1。如果存在“.”,计数器将重置为0。如果有不同的部件,计数器将重置为1。如果这4个状态计数器中的任何一个达到4,则您处于获胜位置。

下面的代码是水平(状态变量0)和垂直(状态变量1)获胜方向的完整代码。剩下的练习是完成代表每个对角线方向的两行(状态变量2和3)。

publicstaticboolean determinatewin(字符串[][]板){
int[][]计数器=新的int[board[0]。长度+1][board.length+1][4];
对于(int y=0;y0&&board[y][x]。等于(board[y-1][x])?计数器[y-1][x][1]+1:1;
//对角线1待办事项:计数器[y][x][2]=
//对角线2待办事项:计数器[y][x][3]=
如果(计数器[y][x][0]==4 |计数器[y][x][1]==4 |计数器[y][x][2]==4 |计数器[y][x][3]==4)
返回true;
}
}
}
返回false;
}

我已经编辑了我的帖子,以显示我的代码在做什么。为什么你要多次设置won=true?我想,一旦赢了,你可以马上回来。我还没见过其他地方你把won设为false。可悲的是,我不明白你想做什么。
public static boolean determineWin(String[][] board) {

    int[][][] counters = new int[board[0].length+1][board.length+1][4];

    for (int y=0; y<board.length; y++) {
        for (int x=0; x<board[0].length; x++) {
            if (!board[y][x].equals(".")) {
                counters[y][x][0] = (x>0 && board[y][x].equals(board[y][x-1])) ? counters[y][x-1][0] + 1 : 1;
                counters[y][x][1] = (y>0 && board[y][x].equals(board[y-1][x])) ? counters[y-1][x][1] + 1 : 1;
                // Diagonal 1 TODO:  counters[y][x][2] = 
                // Diagonal 2 TODO:  counters[y][x][3] = 
                if (counters[y][x][0] == 4 || counters[y][x][1] == 4 || counters[y][x][2] == 4 || counters[y][x][3] == 4)
                    return true;
            }
        }
    }
    return false;
}