为了账号安全,请及时绑定邮箱和手机立即绑定

同一行没有重复数字的多维数组

同一行没有重复数字的多维数组

江户川乱折腾 2021-09-12 16:46:34
  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”中的数字进行比较的索引,如果存在与索引“j”中包含的数字相等的数字,则检查整行。所以我唯一的问题是,在检测到“k”中的数字等于“j”中的数字后,索引“k”中的数字将生成一个新数字来替换“k”中的当前数字,但结果在控制台显示原始 5x5 数组(在更改之前是数组的第一个形式)已更改,但已替换的数字生成的数字已经存在,即使它应该继续更改,直到“k”无法检测到任何重复的数字。我可以想到其他方法,但我真的很想知道为什么它不起作用,尽管我真的认为它不应该带来任何问题,但我可能错过了一些东西。这是不应该发生的结果示例。从9 1 3 8 45 3 2 4 89 8 5 6 56 3 0 8 72 8 6 3 9到9 1 3 8 45 3 2 4 89 8 5 6 96 3 0 8 72 8 6 3 9它不应该发生,因为“k”应该从索引 0 开始到 4 看到它。虽然“j”在索引 4 中,而“k”在索引 0 中,它应该立即检测到它并将“k”中的数字更改为其他随机数。编辑:我看到你们展示的不同方式,但我要求的是在不使用任何导入的情况下提供更好的解决方案。我们的老师给了我们这个作业,告诉我们没有使用任何这些导入,这使得它变得更加复杂,但这正是我们所要求的。我尝试了一段时间,但仍然没有发生任何变化。
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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


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

            }

        }

    }


}



查看完整回答
反对 回复 2021-09-12
?
弑天下

TA贡献1818条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-09-12
?
当年话下

TA贡献1890条经验 获得超9个赞

这是解决问题的不同方法,它使用混洗的 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();

}


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信