我正在尝试使用从1到最大的随机数填充2D数组,但是这样的方式是没有行包含多个值,并且每行的值从最低到最高排序。例如:
1 3 5 6
2 4 6 7
2 2 5 9
前两行没问题,但第三行包含重复值。如何确保不会发生这种情况?任何帮助将非常感激 :)。到目前为止我想出的是:
int[][] array = new int[s][c];
for (int rows = 0; rows < array.length; rows++) {
for (int cols = 0; cols < array[rows].length; cols++) {
array[rows][cols] = (rand.nextInt(max)+1);
System.out.print(array[rows][cols]);
}
System.out.println();
我再次希望每行中的元素从最低到最高排序,我不知道该怎么做!
答案 0 :(得分:2)
在将值添加到数组之前,请检查它是否已存在:
int prevNum = 0;
while(true) {
int num = (rand.nextInt(max) + 1);
if(!(Arrays.asList(array).contains(num)) && num > prevNum && num < max - 4) {
array[rows][cols] = num;
prevNum = num;
break;
}
}
while
循环将继续运行,直到num
不在数组中,它大于前一个数字,并且至少比max
小4(因为这是第二个数组中有多少个值,我们不希望第一次尝试时达到最大值,当它break
时(终止while
循环)。
答案 1 :(得分:0)
您应该将生成的行值存储在arraylist
中,然后检查新值是否在arraylist
中。
int[][] array = new int[3][4];
ArrayList<Integer> row = new ArrayList<>(); //represent a row
for (int rows = 0; rows < array.length; rows++) {
for (int cols = 0; cols < array[rows].length; cols++) {
int randomNumber = rand.nextInt(max)+1; //random number
//checking if the generated value is in the row
//otherwise keep on generating new value.
while(!row.contains(randomNumber)){
randomNumber = rand.nextInt(max)+1;
}
array[rows][cols] = (randomNumber);
//end of an row we should clear the previous row.
row.clear();
}
Arrays.sort(array[rows]);
}
答案 2 :(得分:0)
你最好的办法是解决这个问题。生成一组唯一的随机数,然后在生成后对每一行进行排序。
要生成一组唯一的随机数,您可以采用以下两种方式之一:保持生成数字并针对已生成的数字检查每个数字,或者创建一组随机抽取的值,以及你去的时候从那个集合中删除值。哪一个最容易取决于你从中得到多少可能的值。
e.g。你可以制作一个数组:
int[] choices = {0,1,2,3,4,5,6,7,8,9};
然后从0-9开始随机滚动,给你你的号码。无论你选择哪一个,都将9换成那个插槽。所以例如如果你滚动“4”,数组将变为
int[] choices = {0,1,2,3,9,5,6,7,8,-};
然后你滚动0-8,并在8位置换掉任何被移除的东西。根据需要对多个数字重复此操作。显然,这只适用于选择数量相当少的情况。如果选择的数量很大(例如32位数字),那么只需随机滚动并检查所有先前创建的数字。
生成每个数字时,请在行中执行已排序的插入。