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”,如果有数字等于它在索引“j”中包含的数字,则检查整行。所以我唯一的问题是,在检测到“k”中的数字等于“j”中的数字后,索引“k”中的数字将生成一个新数字,替换“k”中的当前数字,但结果在控制台中显示原始的5x5数组是数组在更改之前首先形成的数组已被更改,但已替换的数字生成了已存在的数字,即使它应该保持更改,直到“k”无法检测到任何重复的数字。
我可以想到其他方法,但我真的想知道为什么它不起作用,即使我真的认为它不应该给任何问题,但我可能错过了一些东西。
这是不应该发生的结果的例子。
从
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
它不应该发生,因为“k”应该看到它,因为他从索引0到4开始。
当“j”在索引4中并且“k”在索引0中时它应该立即检测到它并且将“k”中的数字改变为其他随机的数字。
编辑:我看到你们展示的不同方式,但我要求的是提供更好的解决方案而不使用任何进口。我们的老师给了我们这个任务,告诉我们不使用任何导入它的东西,这使得它变得更复杂,但这就是我们所要求的。我试了一会儿,但仍然没有发生变化。
我以不同的方式编辑了你的代码。我写了一些评论来清楚地理解代码。试试吧。
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);
}
}
}
}
这是您的代码编辑。我还评论了内联的变化和原因。您可以更轻松地完成它,但我认为它可以让您更好地编辑您的示例,以便您可以理解。唯一的问题是你应该将值存储在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]+" ");
}
}
}
}
以下是使用混洗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();
}
我读取你的逻辑的方式是,当你找到一个副本时,你会生成一个新数字,并且新数字将在外部(j
)循环的下一次迭代中得到验证。问题是当j==k
因为那个数字不会被验证时,通常这不是问题,因为j
会增加,然后该数字将被验证,除了j==4
,因为那是最后一次迭代。
因此,修改最右边的列,不会检查该值,因为'j == k'永远不会为false。
代码中的问题是,在检测到重复值后,您分配了新生成的随机数,而不检查它是否也是重复的数字。我在这里做的是我检测到重复,在分配/替换新生成的随机数之前,我将检查它是否也是重复的,如果它是重复的,我将生成另一个,否则我将分配它并继续前进。
(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);
}