Java 如何在忽略一个特定值的情况下在矩阵/数组中查找重复项?

Java 如何在忽略一个特定值的情况下在矩阵/数组中查找重复项?,java,arrays,matrix,duplicates,Java,Arrays,Matrix,Duplicates,我目前正在用java编写一个sodoku游戏,其中一条规则是每行不能多次包含相同的数字(1-9)。数字0表示该框为空。 如果找到重复项,我的“checkRow”布尔方法应该返回“false”,如果没有找到重复项,应该返回“true”(正确的行)。我知道如何查找重复项,但由于值“0”表示空框,因此允许重复“0” 我如何做到这一点 这是我到目前为止想出的代码。它在每个测试用例中返回“true”(未找到重复项) 公共布尔校验行(int行){ 对于(int k=0;k0){ //调试打印 System.

我目前正在用java编写一个sodoku游戏,其中一条规则是每行不能多次包含相同的数字(1-9)。数字0表示该框为空。 如果找到重复项,我的“checkRow”布尔方法应该返回“false”,如果没有找到重复项,应该返回“true”(正确的行)。我知道如何查找重复项,但由于值“0”表示空框,因此允许重复“0”

我如何做到这一点

这是我到目前为止想出的代码。它在每个测试用例中返回“true”(未找到重复项)

公共布尔校验行(int行){
对于(int k=0;k
使用加法数组存储找到的值的代码:

public boolean checkRow(int row){
  
  int[] found = new int[9];
  for (int k = 0; k < grid.length; k++){
      if (grid[row][k] > 0 && grid[row][k] < 10){
          found[grid[row][k]]++;
      }
 
      if (found[grid[row][k]] > 1){
          return false;
      }
      
  
     }
    return true;                
}
公共布尔校验行(int行){
int[]found=新int[9];
对于(int k=0;k0和网格[行][k]<10){
找到[网格[行][k]++;
}
如果(找到[网格[行][k]]>1){
返回false;
}
}
返回true;
}
这也只返回true


提前谢谢

根据@Thomas comment,解决方案如下(不使用全局
网格
变量)

public静态布尔值isRowValid(int[]行){
int[]freq=新的int[9];
for(int num:row){
if(num>0&&freq[num-1]++>0){
//调试打印
System.out.printf(“找到重复的%d%n”,num);
返回false;
}
}
返回true;
}
试验

int[][]网格={
{1, 2, 3, 4, 5, 6, 7, 8, 9},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 2, 0, 0, 8, 0},
{0, 1, 0, 0, 2, 0, 0, 1, 0},
{1, 2, 3, 4, 5, 6, 7, 8, 1},
{1, 2, 3, 4, 1, 6, 7, 8, 9},
{0, 2, 0, 3, 1, 4, 0, 1, 1},
{3, 2, 0, 1, 3, 0, 3, 0, 0},
{7, 2, 0, 1, 3, 0, 3, 0, 7},
};
对于(int[]行:网格){
System.out.printf(“行%s没有DUP?%s%n”,Arrays.toString(行),isRowValid(行));
}
输出

Row [1, 2, 3, 4, 5, 6, 7, 8, 9] has no dups? true
Row [0, 0, 0, 0, 0, 0, 0, 0, 0] has no dups? true
Row [0, 1, 0, 0, 2, 0, 0, 8, 0] has no dups? true
Duplicate 1 found
Row [0, 1, 0, 0, 2, 0, 0, 1, 0] has no dups? false
Duplicate 1 found
Row [1, 2, 3, 4, 5, 6, 7, 8, 1] has no dups? false
Duplicate 1 found
Row [1, 2, 3, 4, 1, 6, 7, 8, 9] has no dups? false
Duplicate 1 found
Row [0, 2, 0, 3, 1, 4, 0, 1, 1] has no dups? false
Duplicate 3 found
Row [3, 2, 0, 1, 3, 0, 3, 0, 0] has no dups? false
Duplicate 3 found
Row [7, 2, 0, 1, 3, 0, 3, 0, 7] has no dups? false

使用流API的等效解决方案如下所示:

public静态布尔值isRowValidStream(int[]行){
int[]freq=新的int[9];
返回Arrays.stream(row)//getIntStream
.filter(x->x>0)//过滤掉所有的零
.map(x->freq[x-1]++)//计算频率
.noneMatch(f->f>0);//查找第一个频率值1
}

您的代码看起来是正确的,有什么问题吗?我可能不使用嵌套循环,而是使用一个临时数组来存储每个数字的出现次数(该数字将是数组的索引),如果该数字对于除0以外的任何索引都大于1,则会发现一个重复的数字。这样就只需要一个循环。@Thomas,我现在已经为这个解决方案找到了代码。但是,每次都是这样。用新代码更新了帖子,注释中的代码很难阅读。您是否调试了代码以查看
grid
是否是正确的数组,长度是否正确等。?
Row [1, 2, 3, 4, 5, 6, 7, 8, 9] has no dups? true
Row [0, 0, 0, 0, 0, 0, 0, 0, 0] has no dups? true
Row [0, 1, 0, 0, 2, 0, 0, 8, 0] has no dups? true
Duplicate 1 found
Row [0, 1, 0, 0, 2, 0, 0, 1, 0] has no dups? false
Duplicate 1 found
Row [1, 2, 3, 4, 5, 6, 7, 8, 1] has no dups? false
Duplicate 1 found
Row [1, 2, 3, 4, 1, 6, 7, 8, 9] has no dups? false
Duplicate 1 found
Row [0, 2, 0, 3, 1, 4, 0, 1, 1] has no dups? false
Duplicate 3 found
Row [3, 2, 0, 1, 3, 0, 3, 0, 0] has no dups? false
Duplicate 3 found
Row [7, 2, 0, 1, 3, 0, 3, 0, 7] has no dups? false