在Java中比较数组中的值?
我有一个2D数组,它代表一个数独游戏 我正在尝试检查游戏是否有错误,就像典型的数独游戏一样: 行、列或3x3正方形内不重复数字(1-9)。 没有空单元格 我对Java非常陌生,所以我的知识有限。我要尝试一个很长的if,else语句来比较所有的单元格。这不起作用,因为重复了-1。(-1表示一个空正方形)。我试图绕开这个话题,但意识到这个if语句太混乱了,必须有更好的方法 我现在认为最好的方法是使用嵌套for循环遍历每行、每列和3x3正方形。另一方面,检查空电池,我想我已经找到了答案。(嵌套用于在2D数组中检查-1的语句) 我还想把所有的数字加在一起,列,或3x3平方,如果它不等于45,那么游戏就不完整了吗 至于检查重复值,我不确定如何实现嵌套的在Java中比较数组中的值?,java,Java,我有一个2D数组,它代表一个数独游戏 我正在尝试检查游戏是否有错误,就像典型的数独游戏一样: 行、列或3x3正方形内不重复数字(1-9)。 没有空单元格 我对Java非常陌生,所以我的知识有限。我要尝试一个很长的if,else语句来比较所有的单元格。这不起作用,因为重复了-1。(-1表示一个空正方形)。我试图绕开这个话题,但意识到这个if语句太混乱了,必须有更好的方法 我现在认为最好的方法是使用嵌套for循环遍历每行、每列和3x3正方形。另一方面,检查空电池,我想我已经找到了答案。(嵌套用于在2
编辑:让我澄清一点,我真的不想每次都检查重复值,我只是希望游戏保持不完整,如果有重复值。(例如,允许重复值,只是不能像真正的数独游戏那样赢得游戏)。我觉得“添加到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初学者来说,它很简单,也很容易理解。因为您是新手