java - 重构java代码的问题

标签 java loops refactoring

我现在正在做作业,有一个关于用 Java 重构代码的问题。 我现在正在研究数独,我需要检查 3x3 框是否有效。为此,我创建了一个包含所有盒子编号的一维数组,然后比较它们的值。它现在正在工作,但实际上根本没有重构。我真的很想知道是否有任何方法可以减少所有这些复制粘贴。

public static boolean validFieldParts() {
    int counter = 0;
    boolean isValid = false;

    int[] copyArray1 = new int[field.length];
    int[] copyArray2 = new int[field.length];
    int[] copyArray3 = new int[field.length];
    int[] copyArray4 = new int[field.length];
    int[] copyArray5 = new int[field.length];
    int[] copyArray6 = new int[field.length];
    int[] copyArray7 = new int[field.length];
    int[] copyArray8 = new int[field.length];
    int[] copyArray9 = new int[field.length];


    // copy the array

    // 1 große Feld
    for (int i = 0; i < field.length / 3; i++) {
        for (int j = 0; j < field[i].length / 3; j++) {
            copyArray1[i * 3 + j] = field[i][j];
        }
    }

    // 2 große Feld
    for (int i = 0; i < field.length / 3; i++) {
        for (int j = 3; j < 6; j++) {
            copyArray2[i * 3 + j - 3] = field[i][j];
        }
    }

    // 3 große Feld
    for (int i = 0; i < field.length / 3; i++) {
        for (int j = 6; j < 9; j++) {
            copyArray3[i * 3 + j - 6] = field[i][j];
        }
    }

    // 4 große Feld
    for (int i = 3; i < 6; i++) {
        for (int j = 0; j < field[i].length / 3; j++) {
            copyArray4[(i - 3) * 3 + j] = field[i][j];
        }
    }

    // 5 große Feld
    for (int i = 3; i < 6; i++) {
        for (int j = 3; j < 6; j++) {
            copyArray5[(i - 3) * 3 + j - 3] = field[i][j];
        }
    }
    // 6 große Feld
    for (int i = 3; i < 6; i++) {
        for (int j = 6; j < 9; j++) {
            copyArray6[(i - 3) * 3 + j - 6] = field[i][j];
        }
    }

    // 7 große Feld
    for (int i = 6; i < 9; i++) {
        for (int j = 0; j < field[i].length / 3; j++) {
            copyArray7[(i - 6) * 3 + j] = field[i][j];
        }
    }

    // 8 große Feld
    for (int i = 6; i < 9; i++) {
        for (int j = 3; j < 6; j++) {
            copyArray8[(i - 6) * 3 + j - 3] = field[i][j];
        }
    }

    // 9 große Feld
    for (int i = 6; i < 9; i++) {
        for (int j = 6; j < 9; j++) {
            copyArray9[(i - 6) * 3 + j - 6] = field[i][j];
        }
    }

    Arrays.sort(copyArray1);
    Arrays.sort(copyArray2);
    Arrays.sort(copyArray3);
    Arrays.sort(copyArray4);
    Arrays.sort(copyArray5);
    Arrays.sort(copyArray6);
    Arrays.sort(copyArray7);
    Arrays.sort(copyArray8);
    Arrays.sort(copyArray9);

    for (int i = 1; i < copyArray1.length; i++) {
        if (copyArray1[i] == copyArray1[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray2.length; i++) {
        if (copyArray2[i] == copyArray2[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray3.length; i++) {
        if (copyArray3[i] == copyArray3[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray4.length; i++) {
        if (copyArray4[i] == copyArray4[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray5.length; i++) {
        if (copyArray5[i] == copyArray5[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray6.length; i++) {
        if (copyArray6[i] == copyArray6[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray7.length; i++) {
        if (copyArray7[i] == copyArray7[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray8.length; i++) {
        if (copyArray8[i] == copyArray8[i - 1])
            counter++;
        else
            continue;
    }
    for (int i = 1; i < copyArray9.length; i++) {
        if (copyArray9[i] == copyArray9[i - 1])
            counter++;
        else
            continue;
    }

    if (counter > 0)
        isValid = false;
    else
        isValid = true;

    return isValid;

}

最佳答案

我不会使用 9 个不同的数组和 9 个不同的循环来表示 9 的每个部分,而是使用另一个嵌套的 for 循环,使用相同的数组迭代每个簇。

//Iterate over each 'block'
for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
        //Iterate over each cell in the block
        for (int i = row*3; i < (row+1)*3; i++) {
            for (int j = col*3; j < (col+1)*3; j++) {
                copyArray[(i - 3) * 3 + j - 3] = field[i][j];
            }
        }

        //Sort array and do duplication check here - return false if dupe found
    }
}
return true

这会减少代码的长度,尽管它可能不会更有效。

不使用计数器标志,每当您增加计数器时返回 false 并在最后返回 true 会更快。这将防止运行不必要的代码

关于java - 重构java代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839889/

相关文章:

c - 最佳无限循环

c - 重构重复的 guard 语句

java - 禁用加速度计并使用按键输入对其进行模拟

c++ - C++中迭代器的指针如何在循环中变化?

java - 列表模式的长度

c++ - 如果我在我的 C++ 项目中使用 C 样式转换,是否值得重构为 C++ 转换?

c# - Visual Studio 重构快速操作和重构错误

java - 少了一个return语句,但是return语句有吗?

java - Swing 中的字体渲染丑陋

Java Eclipse : How to clean and how to run from different directory