在Java中比较数组中的值?

在Java中比较数组中的值?,java,Java,我有一个2D数组,它代表一个数独游戏 我正在尝试检查游戏是否有错误,就像典型的数独游戏一样: 行、列或3x3正方形内不重复数字(1-9)。 没有空单元格 我对Java非常陌生,所以我的知识有限。我要尝试一个很长的if,else语句来比较所有的单元格。这不起作用,因为重复了-1。(-1表示一个空正方形)。我试图绕开这个话题,但意识到这个if语句太混乱了,必须有更好的方法 我现在认为最好的方法是使用嵌套for循环遍历每行、每列和3x3正方形。另一方面,检查空电池,我想我已经找到了答案。(嵌套用于在2

我有一个2D数组,它代表一个数独游戏

我正在尝试检查游戏是否有错误,就像典型的数独游戏一样:

行、列或3x3正方形内不重复数字(1-9)。 没有空单元格

我对Java非常陌生,所以我的知识有限。我要尝试一个很长的if,else语句来比较所有的单元格。这不起作用,因为重复了-1。(-1表示一个空正方形)。我试图绕开这个话题,但意识到这个if语句太混乱了,必须有更好的方法

我现在认为最好的方法是使用嵌套for循环遍历每行、每列和3x3正方形。另一方面,检查空电池,我想我已经找到了答案。(嵌套用于在2D数组中检查-1的语句)

我还想把所有的数字加在一起,列,或3x3平方,如果它不等于45,那么游戏就不完整了吗

至于检查重复值,我不确定如何实现嵌套的


编辑:让我澄清一点,我真的不想每次都检查重复值,我只是希望游戏保持不完整,如果有重复值。(例如,允许重复值,只是不能像真正的数独游戏那样赢得游戏)。我觉得“添加到45”的方法效果最好。

如果不检查整个游戏板是否没有重复,而是检查特定的行、列和3x3正方形是否只有在放置新值时(由玩家或从文件加载游戏时)才有重复,则可以真正简化事情

这样,您只需要三个非嵌套循环。一个用于检查正在放置的新值在其行、列和3x3正方形中是否不存在

您也不必担心检查a-1(假设您已经错误地检查了输入值1-9)


注意:“检查一行、一列或3x3正方形加起来是否等于45”不起作用。这是一个好主意,但它不会捕获多个重复项(例如,一行5个重复项都可以通过)。

如果不检查整个游戏板是否没有所有重复项,而是检查特定的行、列和3x3正方形是否只有在放置新值时才有重复项,则可以真正简化操作(由玩家或从文件加载游戏时)

这样,您只需要三个非嵌套循环。每个循环一个,以检查正在放置的新值在其行、列和3x3正方形中是否已经存在

您也不必担心检查a-1(假设您已经错误地检查了输入值1-9)


注意:“检查一行、一列或一个3x3的正方形加起来是否等于45”不起作用。这是一个好主意,但它不能捕获多个重复项(例如,一行全部5个都可以通过).

这是一个很好的问题,我很无聊,所以这里有一个相当完整的方法来描述。当然,还有很多其他方法!这种方法很有效,但不是特别优雅。我想看看其他人有什么想法

1) 为每行、每列和3x3正方形创建一个对象。将它们放入数组中,如下所示:

// Initialize arrays
BitSet[] rows = new BitSet[9];
BitSet[] cols = new BitSet[9];
BitSet[] squares = new BitSet[9];
// Initialize the array elements
for(int i=0;i<9;i++){
    rows[i] = new BitSet(9);
    cols[i] = new BitSet(9);
    squares[i] = new BitSet(9);
}
public boolean hasRepeats(){
            // ...
        // initialize rows, cols, and squares as above
            // ...

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int gridValue = grid[i + 9 * j];
            if( gridValue == -1 ){
                // Skip empty squares
                continue;
            }
            // Check for repeats
            if( rows[i].get(gridValue) ){
                return true; 
            }
            rows[i].set(gridValue);
            if( cols[j].get(gridValue) ){
                return true;
            }
            cols[j].set(gridValue);
            BitSet square = squares[ i / 3 + 3 * ( j / 3 ) ]
            if( square.get( gridValue ) ){
                return true;
            }
            square.set( gridValue );
        }
    }
    return false;
}
我们可以通过简单地将i和j除以3得到上面布局中的行和列。所以我们想要的索引是
i/3+3*(j/3)
。注意整数除法在这里起作用,因此
7/3==8/3==2
,这意味着当i和j等于8时,我们有例如
8/3+3*(8/3)=2+3*2=8

综合所有这些,我们可以编写方法来检查谜题是否没有像这样解决:

// Initialize arrays
BitSet[] rows = new BitSet[9];
BitSet[] cols = new BitSet[9];
BitSet[] squares = new BitSet[9];
// Initialize the array elements
for(int i=0;i<9;i++){
    rows[i] = new BitSet(9);
    cols[i] = new BitSet(9);
    squares[i] = new BitSet(9);
}
public boolean hasRepeats(){
            // ...
        // initialize rows, cols, and squares as above
            // ...

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int gridValue = grid[i + 9 * j];
            if( gridValue == -1 ){
                // Skip empty squares
                continue;
            }
            // Check for repeats
            if( rows[i].get(gridValue) ){
                return true; 
            }
            rows[i].set(gridValue);
            if( cols[j].get(gridValue) ){
                return true;
            }
            cols[j].set(gridValue);
            BitSet square = squares[ i / 3 + 3 * ( j / 3 ) ]
            if( square.get( gridValue ) ){
                return true;
            }
            square.set( gridValue );
        }
    }
    return false;
}
public boolean hasreats(){
// ...
//如上所述初始化行、列和正方形
// ...

对于(int i=0;i这是一个很好的问题,我很无聊,所以这里有一个相当完整的方法来描述。当然,还有很多其他方法!这种方法很有效,但不是特别优雅。我想看看其他人有什么想法

1) 为每行、每列和3x3正方形创建一个对象。将它们放入数组中,如下所示:

// Initialize arrays
BitSet[] rows = new BitSet[9];
BitSet[] cols = new BitSet[9];
BitSet[] squares = new BitSet[9];
// Initialize the array elements
for(int i=0;i<9;i++){
    rows[i] = new BitSet(9);
    cols[i] = new BitSet(9);
    squares[i] = new BitSet(9);
}
public boolean hasRepeats(){
            // ...
        // initialize rows, cols, and squares as above
            // ...

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int gridValue = grid[i + 9 * j];
            if( gridValue == -1 ){
                // Skip empty squares
                continue;
            }
            // Check for repeats
            if( rows[i].get(gridValue) ){
                return true; 
            }
            rows[i].set(gridValue);
            if( cols[j].get(gridValue) ){
                return true;
            }
            cols[j].set(gridValue);
            BitSet square = squares[ i / 3 + 3 * ( j / 3 ) ]
            if( square.get( gridValue ) ){
                return true;
            }
            square.set( gridValue );
        }
    }
    return false;
}
通过简单地将i和j除以3,我们可以得到上面布局中的行和列。因此,我们想要的索引是
i/3+3*(j/3)
。请注意,整数除法在这里起作用,因此
7/3==8/3==2
,这意味着i和j等于8时,例如
8/3+3*(8/3)=2+3*2=8

综合所有这些,我们可以编写方法来检查谜题是否没有像这样解决:

// Initialize arrays
BitSet[] rows = new BitSet[9];
BitSet[] cols = new BitSet[9];
BitSet[] squares = new BitSet[9];
// Initialize the array elements
for(int i=0;i<9;i++){
    rows[i] = new BitSet(9);
    cols[i] = new BitSet(9);
    squares[i] = new BitSet(9);
}
public boolean hasRepeats(){
            // ...
        // initialize rows, cols, and squares as above
            // ...

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int gridValue = grid[i + 9 * j];
            if( gridValue == -1 ){
                // Skip empty squares
                continue;
            }
            // Check for repeats
            if( rows[i].get(gridValue) ){
                return true; 
            }
            rows[i].set(gridValue);
            if( cols[j].get(gridValue) ){
                return true;
            }
            cols[j].set(gridValue);
            BitSet square = squares[ i / 3 + 3 * ( j / 3 ) ]
            if( square.get( gridValue ) ){
                return true;
            }
            square.set( gridValue );
        }
    }
    return false;
}
public boolean hasreats(){
// ...
//如上所述初始化行、列和正方形
// ...

对于(inti=0;i由于您是java新手,我假设您使用2D整数数组来存储3x3平方。您的目标是验证平方中是否存在任何重复整数(除了-1)

private static final int WIDTH = 3;
private static final int HEIGHT = 3;
private static int[][] cells = new int[WIDTH][HEIGHT];
您可以通过-1初始化2D数组

for (int i = 0; i < WIDTH; i++) {
    for (int j = 0; j < HEIGHT; j++) {
        cells[i][j] = -1;
    }
}
for(int i=0;i
一种简单的方法是使用列表临时存储用户输入,并检查添加的输入是否已经存在

private static boolean validateCells() {
    boolean isValid = true;
    List<Integer> inputValues = new ArrayList<Integer>();
    for (int i = 0; i < WIDTH; i++) {
        for (int j = 0; j < HEIGHT; j++) {
            int inputValue = cells[i][j];
            if (inputValue != -1) {
                if (inputValues.contains(inputValue)) {
                    isValid = false;
                    break;
                } else {
                    inputValues.add(inputValue);
                }
            }
        }
    }
    return isValid;
}
private静态布尔validateCells(){
布尔值isValid=true;
List inputValues=new ArrayList();
对于(int i=0;i
这显然不是一种有效的方法,但是对于java初学者来说,它很简单,也很容易理解。

因为您是新手