Java 同一行中没有重复编号的多维数组

Java 同一行中没有重复编号的多维数组,java,arrays,multidimensional-array,random,Java,Arrays,Multidimensional Array,Random,我想创建一个多维数组,而不在同一行中有任何重复的数字,因此列是否有重复的数字并不重要 我在这里做的是生成5x5数组,形成正方形。 将索引j与索引k中的数字进行比较,检查整行是否有与索引j中包含的数字相等的数字。 所以我唯一的问题是,在检测到k中的数字等于j中的数字之后,索引k中的数字将生成一个新的数字来替换k中的当前数字,但控制台中的结果显示,原始5x5数组在更改之前是数组的第一个组成部分,该数组已被更改,但已被替换的数字生成了一个已经存在的数字,即使它应该一直更改,直到k无法更改为止检测任何重

我想创建一个多维数组,而不在同一行中有任何重复的数字,因此列是否有重复的数字并不重要

我在这里做的是生成5x5数组,形成正方形。 将索引j与索引k中的数字进行比较,检查整行是否有与索引j中包含的数字相等的数字。 所以我唯一的问题是,在检测到k中的数字等于j中的数字之后,索引k中的数字将生成一个新的数字来替换k中的当前数字,但控制台中的结果显示,原始5x5数组在更改之前是数组的第一个组成部分,该数组已被更改,但已被替换的数字生成了一个已经存在的数字,即使它应该一直更改,直到k无法更改为止检测任何重复的数字

我可以想出其他的方法,但我真的想知道为什么它不起作用,尽管我真的认为它不应该给任何问题,但我可能错过了一些东西

这是一个不应该出现的结果示例

91384 5 3 2 4 8 9 8 5 6 5 6 3 0 8 7 28639

91384 5 3 2 4 8 9 8 5 6 9 6 3 0 8 7 28639

这不应该发生,因为k应该看到它,因为他从索引0到4开始

当j在索引4中,k在索引0中时,它应该立即检测到它,并将k中的数字更改为其他随机数

编辑:我看到你们展示的不同方式,但我要求的是在不使用任何导入的情况下提供更好的解决方案。我们的老师给了我们这个作业,告诉我们没有使用任何进口,这使得它更复杂,但这是我们被要求的。
我用while进行了尝试,但仍然没有发生任何更改。

这是您编辑的代码。我还评论了更改的内容和原因。你本可以做得更简单,但我认为编辑你的例子更适合你,这样你就可以理解了。唯一的问题是,您应该将该值存储在矩阵2[i][j]=newValue上,以便让k转到行的末尾,并与所有其他值一起检查您的随机数是否不是现有的数字

希望能有帮助

  int matrice2 [][] = new int [5][5];
  for (int i=0;i<5;i++) {
      System.out.println(" ");
      for(int j=0;j<5;j++) {
          matrice2[i][j] = (int)(Math.random()*10);
          System.out.print(" "+matrice2[i][j]+" ");
      }
  }
  System.out.println(" ");
  System.out.println(" ");
  for (int i=0;i<5;i++) {
      System.out.println(" ");
      for(int j=0;j<5;j++) {
          for (int k=0;k<5;k++) {
              if(j!=k) {
                  if (matrice2[i][j]==matrice2[i][k]) {
                      matrice2[i][k]=(int)(Math.random()*10);
                  }
              }
          }
          System.out.print(" "+matrice2[i][j]+" ");
      }
  }

这里有一种解决问题的不同方法,它使用无序排列的ArrayList,而不是检查当前行中是否存在值

public class UniqueMatrix {

    public static void main (String[] args) {
        int matrice2 [][] = new int [5][5];
        for (int i=0;i<5;i++) {
            System.out.println(" ");
            for(int j=0;j<5;j++) {
                matrice2[i][j] = (int)(Math.random()*10);
                System.out.print(" "+matrice2[i][j]+" ");
            }
        }
        System.out.println(" ");
        System.out.println(" ");
        for (int i=0;i<5;i++) {
            System.out.println(" ");
            for(int j=0;j<5;j++) {
                for (int k=0;k<5;k++) {
                    if(j!=k) {
                        if (matrice2[i][j]==matrice2[i][k]) {
                            int newValue = (int)(Math.random()*10);
                            //store the newly found value in j for you have time to check with others till the end
                            matrice2[i][j] = newValue;
                        }
                    }
                }
                System.out.print(" "+matrice2[i][j]+" ");
            }
        }
    }
}

代码中的问题是,在检测到重复值后,您分配了新生成的随机数,而没有检查它是否也是重复数。我在这里做的是检测重复,在分配/替换新生成的随机数之前,我将检查它是否也是重复的,如果是重复的,我将生成另一个,否则我将分配它并继续

int matrice2[][] = new int[5][5];
ArrayList<Integer> sourceMatrix = new ArrayList<Integer>();

for (int i = 0; i < 10; i++)
    sourceMatrix.add(i);

//generate random matrix using shuffled arraylist
for (int i = 0; i < matrice2.length; i++) {
    Collections.shuffle(sourceMatrix);
    for (int j = 0; j < matrice2[i].length; j++) {
        matrice2[i][j] = sourceMatrix.get(j);
    }
}

//print generated matrix
for (int i = 0; i < matrice2.length; i++) {
    for (int j = 0; j < matrice2[i].length; j++) {
        System.out.print(matrice2[i][j]);
    }
    System.out.println();
}
问题在下面的代码中,您正在使用新的intMath.random*10更新矩阵2[i][k],而不检查它是相同的还是不同的数字

(int)(Math.random()*10); // this code does not guarantee that new unique number is generated every time you call it.

我理解你的逻辑的方式是,当你发现一个重复的时候,你会生成一个新的数字,这个新数字会在下一次的外j循环中被验证。问题是当j==k时,因为该数字不会被验证,通常这不是问题,因为j将增加,然后该数字将被验证,但当j==4时除外,因为这是最后一次迭代


因此,修改最右边的列,该值将不会被检查,因为“j==k”永远不会为false。

我以不同的方式编辑了您的代码。我写了一些注释,以便代码能够清楚地理解。请试一试

          if (matrice2[i][j]==matrice2[i][k]) {
              matrice2[i][k]=(int)(Math.random()*10);
          }

问题是matrice2[i][k]=intMath.random*10可以很好地分配matrice2[i][k]它的当前值。你可以用一段时间继续尝试,直到你得到一个新的值,但是有更好的方法来获得随机的、不同的值。intMath.random*10会给你随机数,它不保证唯一性它的逻辑是可以的,但是存储matrice[i][j]=intMath.random*10而不是matrice[i][k]=intMath.random*10-这样可以让k检查以后的事件,检查我下面的代码段。我确实用while尝试过,但没有成功,我也做了@atrifan提到的,这是我第一次尝试编写代码,但仍然没有成功。@KRIN3X检查更新的答案和建议。我看不到你的观点,但例如索引j是4,它可以降落的最终索引,而索引k从0开始到4,其中当前j为。我不明白为什么会有索引不被检查。你是对的,尽管它与j=4有关。让我重写我的答案…@KRIN3X你有试过这个吗?事实上你的第三个循环不是必需的。不,它也没有。我只是复制粘贴并分析它,但由于某种原因,它并没有解决问题。我完全理解你的观点,也理解其他人所说的,我做了你们所有人所说的,但仍然没有
工作我在第一次尝试编写代码时就这样做了。可能是我们误解了你的问题,它对我有效。正如你在截图中看到的,它仍然显示重复的数字,上面的代码就是你所说的。
public class UniqueMatrix {
    public static void main(String[] args) {

        int matrix[][] = new int[5][5];
        boolean uniqeMatrixFound = false;
        while (!uniqeMatrixFound) {
            //fill matrix until uniqe matrix found value is true 
            fillMatrix(matrix);
            for (int i = 0; i < matrix.length; i++) {
                HashSet<Integer> columnNumber = new HashSet<>();
                for (int j = 0; j < matrix.length; j++) {
                    columnNumber.add(matrix[j][i]);
                }
                //if set size not equal to matrix size , create an new uniqe matrix with breaking false value
                if (columnNumber.size() != matrix.length) {
                    uniqeMatrixFound = false;
                    break;
                }
                uniqeMatrixFound = true;
            }
        }

        //print an array 
        for (int i = 0; i < matrix.length; i++) {
            System.out.println(" ");
            for (int j = 0; j < matrix.length; j++) {
                System.out.print(" " + matrix[i][j] + " ");
            }
        }

    }

    //create a matrix with unique value in all rows.
    private static void fillMatrix(int[][] matrice2) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        for (int i = 0; i < matrice2.length; i++) {
            Collections.shuffle(list);
            for (int j = 0; j < matrice2.length; j++) {
                matrice2[i][j] = list.get(j);
            }
        }
    }

}