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

时间:2018-09-10 18:16:15

标签: java arrays multidimensional-array random

  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]+" ");
      }
  }

我想制作一个多维数组,而同一行中没有任何重复的数字,因此该列是否具有重复的数字无关紧要。

我在这里所做的是生成5x5正方形阵列。 将索引“ j”与索引“ k”中的数字进行比较,索引“ k”检查整行是否存在等于索引“ j”中包含的数字的数字。 因此,我唯一的问题是,在检测到“ k”中的数字等于“ j”中的数字后,索引“ k”中的数字将生成一个新数字替换“ k”中的当前数字,但在控制台中表明原始的5x5数组已更改,该数组是在更改之前该数组的第一个数组,但是被替换的数字生成的数字已经存在,即使它应保持更改,直到“ k”无法检测到任何重复的数字为止。 / p>

我可以想到其他方法,但是我真的想知道为什么它不起作用,即使我真的认为它不应该带来任何问题,但是我可能会错过一些东西。

这是不应该发生的结果的示例。

来自

9 1 3 8 4
 5 3 2 4 8
  9 8 5 6 5
 6 3 0 8 7
 2 8 6 3 9

9 1 3 8 4
 5 3 2 4 8
  9 8 5 6 9
 6 3 0 8 7
 2 8 6 3 9

这不应该发生,因为自从索引0到4开始,“ k”应该已经看到了。

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

编辑:我看到你们展示的方式不同,但是我要问的是在不使用任何导入的情况下提供更好的解决方案。我们的老师给了我们这项作业,告诉我们时没有使用任何输入,这使它更加复杂,但这正是我们所要的。  我尝试了一段时间,但仍然没有任何变化。

5 个答案:

答案 0 :(得分:1)

我以其他方式编辑了您的代码。我写了一些注释以使代码清楚地理解。请尝试一下。

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);
            }
        }
    }

}

答案 1 :(得分:0)

这是您的代码已编辑。我还在内联中评论了所做的更改以及原因。您可以更轻松地完成此操作,但我认为它更适合您编辑示例,以便您理解。唯一的问题是您应该将值存储在matrice2 [i] [j] = newValue上(让k转到行的末尾,并与所有其他值一起检查您的随机数是否不存在)

希望有帮助。

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]+" ");
            }
        }
    }
}

答案 2 :(得分:0)

这是使用改组ArrayList而不是检查当前行中是否存在值的方法。

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();
}

答案 3 :(得分:0)

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

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

问题出在下面的代码中,您正在用新的matrice2[i][k]更新(int)(Math.random()*10),而无需检查数字是否相同。

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

答案 4 :(得分:0)

我读懂逻辑的方式是,当您找到一个重复项时,将生成一个新数字,并且该新数字将在外部(j)循环的下一次迭代中得到验证。问题是j==k因为该数字将不被验证,通常这不是问题,因为j将增加,然后该数字将被验证,除了j==4时,因为那是最后一次迭代。

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