我正在生成一个6个整数的数组,范围为1- 54(类似于乐透号码)。但是,在尝试检测重复项时,我的代码没有执行。我试着通过简单的打印来调试"我们已经发现了一个重复的"如果我的条件逻辑会抓住重复。当然,它没有打印出所需的输出:
18-33-39-41-41-45
我想检测副本,以便生成另一个与发现的副本不相等的随机数。我不想仅仅为了获得另一个数字而递增/递减重复的值,我想实际生成1和54之间的另一个不等于副本的值。
这是我的代码:
public class Main {
public static void main(String[] args) {
Random rand = new Random();
int[] luckyArray = new int[6];
//build array
for (int i = 0; i < luckyArray.length; i++) {
int luckyNumber = rand.nextInt(54) + 1;
luckyArray[i] = luckyNumber;
}
//detect duplicates in the array
for (int i = 0; i < luckyArray.length; i++) {
if (i > 0 && luckyArray[i] == luckyArray[i - 1]) {
System.out.print("WE HAVE FOUND A DUPLICATE!");
/* while (luckyArray[i - 1] == luckyArray[i]) {
luckyArray[i] = rand.nextInt(54) + 1;
}*/
}
}
//sort the array before printing
Arrays.sort(luckyArray);
for (int t = 0; t < luckyArray.length; t++) {
if (t != 5) {
System.out.print(luckyArray[t] + "-");
} else System.out.print(luckyArray[t]);
}
}
}
我希望将当前索引[i]
与之前的[i-1]
进行比较,如果/当它们相等时,为当前索引生成一个新值。
提前致谢!
答案 0 :(得分:4)
我会(个人)依赖Set
这里的属性来确保你根本不保留重复项 - 你甚至不需要检查欺骗行为:
Random rand = new Random();
int numNumsToGenerate = 6;
Set<Integer> luckySet = new HashSet<Integer>();
//build set
while (luckySet.size() < numNumsToGenerate) {
luckySet.add(rand.nextInt(54) + 1);
}
一旦您建立了自己的设置,就可以通过创建一个包含List
内容的新Set
对其进行排序:
//sort the array before printing
List<Integer> luckyList = new ArrayList<Integer>(luckySet);
Collections.sort(luckyList);
答案 1 :(得分:2)
移动&#39;排序&#39;在检查重复之前。通过这种方式,您可以确保重复项始终位于彼此旁边,您只需要检查邻居。
这里是检测重复项的代码:
package luckynumber;
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rand = new Random();
int[] luckyArray = new int[6];
// build array
for (int i = 0; i < luckyArray.length; i++) {
int luckyNumber = rand.nextInt(54) + 1;
luckyArray[i] = luckyNumber;
}
// sort the array before detecting duplicates
Arrays.sort(luckyArray);
// detect duplicates in the array
for (int i = 0; i < luckyArray.length; i++) {
if (i > 0 && luckyArray[i] == luckyArray[i - 1]) {
System.out.print("WE HAVE FOUND A DUPLICATE!");
/* while (luckyArray[i - 1] == luckyArray[i]) { luckyArray[i] =
* rand.nextInt(54) + 1; } */
}
}
for (int t = 0; t < luckyArray.length; t++) {
if (t != 5) {
System.out.print(luckyArray[t] + "-");
} else
System.out.print(luckyArray[t]);
}
}
}
当您现在找到重复项并更改数组项时,请确保重新排序并重新检查整个数组。 这剩下的步骤留给读者练习。 ; - )
BTW:使用Set会使代码更简单。
答案 2 :(得分:2)
这是一个使用Java 8流的非常简单的解决方案:
int[] luckyArray = new Random().ints(1, 55).distinct().limit(6).sorted().toArray();
这并不会手动检测重复项 - 而是在选择前6项之前使用distinct
删除它们,然后对它们进行排序。
答案 3 :(得分:1)
使用Java 8:
List<Integer> luckys =
IntStream.rangeClosed(1, 54)
.boxed()
.collect(collectingAndThen(toList(), l -> {
Collections.shuffle(l);
return l;
}))
.stream()
.limit(6)
.collect(toList())
答案 4 :(得分:0)
如果集合不是一个选项,则需要进行每次迭代遍历数组的检查。您当前的支票仅比较序号1和2,2和3等
或者,在插入之前,将要检查的幸运数字分配给int以与阵列进行核对。