Java 为什么此程序不停止阵列中的重复项?

Java 为什么此程序不停止阵列中的重复项?,java,arrays,Java,Arrays,我正试图编写一个程序,生成六个随机整数,并将它们返回给用户,而不让任何数字重复。为什么复制品还能通过 我在谷歌上搜索了一下,并尝试了一些结果,但似乎都不起作用。我想出了自己的方法来解决这个问题,方法如下: 使用for循环,我在numToCheck中每次存储一个来自drawnNums(包含六个随机数的数组)的数字。还有一个变量numOfDuplicates,用于存储找到的数字的数量。使用另一个for循环,我遍历drawnNums中的所有数字,并将其与numToCheck进行比较,然后将一个添加到n

我正试图编写一个程序,生成六个随机整数,并将它们返回给用户,而不让任何数字重复。为什么复制品还能通过

我在谷歌上搜索了一下,并尝试了一些结果,但似乎都不起作用。我想出了自己的方法来解决这个问题,方法如下:

使用for循环,我在
numToCheck
中每次存储一个来自
drawnNums
(包含六个随机数的数组)的数字。还有一个变量
numOfDuplicates
,用于存储找到的数字的数量。使用另一个for循环,我遍历
drawnNums
中的所有数字,并将其与
numToCheck
进行比较,然后将一个添加到
numfoduplicates
。它显然找到了它自己,所以我有一个if语句,它只在
numOfDuplicates
为>=2时重绘数字。这是在我创建数组的同一个函数中,因此它应该创建一个新数组并再次检查,重新绘制,直到没有重复

在我看来,这应该可以阻止副本被返回,但事实并非如此

这是我创建的用来生成数组的类,也是我上面描述的

//绘制一个随机数的私有函数
私有整数drawNumber(){
返回random.nextInt(maxNum)+1;
}
//函数使用drawNumber()随机抽取六个数字并存储在数组中
int[]draw(){
int[]drawnNums={0,0,0,0,0};
对于(int i=0;i=2){
draw();
}
}
打破
}
归还提款;
}
}

我希望,如果数组中存在重复项,则会重新绘制数字,直到有一个没有重复项的数组。但是,当重复运行程序时,仍然有一些数组中存在重复项。

对draw的递归调用没有返回值。应该是

return draw();
外部检查循环在没有完全检查整个阵列是否存在重复项的情况下提前退出,请删除中断。检查内部循环中的x==y,仅当它们不在时才执行重复检查

或者在Java8中,使用一个衬里来替换整个东西

new Random().ints(start, end).distinct().limit(number).toArray();

Ref-

在添加到可返回数组之前,您希望在可返回数组中检查重复项。换句话说,只要draw变量收到一个新的随机值,就可以查看该值是否已经包含在drawnNums数组中:

private int[] draw() {
    int[] drawnNums = {0, 0, 0, 0, 0, 0};
    boolean alreadyHave;
    for (int i = 0; i < drawnNums.length; i++) {
        int draw = drawNumber();
        alreadyHave = false;
        for (int j = 0; j < drawnNums.length; j++) {
            if (draw == drawnNums[j]) {
                alreadyHave = true;
                i--;
                break;
            }
        }
        if (!alreadyHave) {
            drawnNums[i] = draw;
        }
    }
    return drawnNums;
}
private int[]draw(){
int[]drawnNums={0,0,0,0,0};
布尔代数;
对于(int i=0;i
如果您想要唯一性,最简单的方法是使用一个容器来提供唯一性

int[] draw() {
    final int COUNT = 6;
    // get unique numbers
    Set<Integer> nums = new HashSet<>();
    while (nums.size() != COUNT)
        nums.add(drawNumber());
    // convert to array as per original requirements
    // though it would be simpler if we could just
    // return a Collection<Integer>
    int[] result = new int[COUNT];
    int k = 0;
    for (Integer num : nums)
       result[k] = num;
    return result;
}
int[]draw(){
最终整数计数=6;
//获取唯一号码
Set nums=new HashSet();
while(nums.size()!=计数)
nums.add(drawNumber());
//按原要求转换成阵列
//如果我们能
//归还收藏
int[]结果=新的int[计数];
int k=0;
for(整数num:nums)
结果[k]=num;
返回结果;
}
更简单的是,通过改变返回类型,对调用者不会失去有用性:

Collection<Integer> draw() {
    final int COUNT = 6;
    Set<Integer> nums = new HashSet<>();
    while (nums.size() != COUNT)
        nums.add(drawNumber());
    return nums;
}
Collection draw(){
最终整数计数=6;
Set nums=new HashSet();
while(nums.size()!=计数)
nums.add(drawNumber());
返回nums;
}

也许您需要
返回draw()
但我认为更好的方法是在将值添加到数组之前检查它。
for(int y=1;y
有许多更好的方法来实现您在这里尝试的内容,但代码中的问题是,
中断;
只有在检查数组中第一个元素的重复项后才中断。在将draw中的随机值添加到drawnNums数组之前,请检查重复项。此方法用于阻止重复项被添加对数组进行编辑,但它只是将该索引处的值保留为0,我如何绘制另一个数字来代替该数字并进行检查?使用上次编辑之前的代码--外部循环可以是
for(int I;I