我有以下代码生成5位随机数并将它们添加到ArrayList。但是,这些数字必须是唯一的ID。
for(int i = 0; i < myArr.length; i++) {
int id = (int) (Math.round(Math.random() * 89999) + 10000);
idArr.add(id);
}
我正在尝试弄清楚如何在添加之前检查数字是否已经在数组中,但我无法理解最佳方法。
答案 0 :(得分:3)
请勿使用(数组)列表,请使用Set:
Set<Integer> set = ...;
while (set.size() < myArr.length) {
set.add(yourRandomNumber);
}
答案 1 :(得分:1)
使用ArrayList
代替array
。这样您只需要使用ArrayList#contains(obj)
方法来测试id
是否已经在ArrayList
中。
或者,您可以使用HashSet
,使用HashSet#contains()
方法可以更快地完成工作。
答案 2 :(得分:1)
您可以创建Set
个数字。 E.g:
Set<Integer> intSet = new HashSet<Integer>();
while(intSet.size() < myArr.length) {
intSet.add(getNextRandomInt());
}
然后你可以用Set
做任何事情。
所以,如果你需要一个数组,只需调用:
Integer[] intArray = intSet.toArray(new Integer[myArr.length]);
或者,如果您需要ArrayList
或int[]
数组:
// ArrayList:
List<Integer> ints = new ArrayList<Integer>();
ints.addAll(intSet);
// int[] array:
int[] intArray = new int[myArr.length];
for( int i = 0; i<intArray.length; ++i) {
intArray[i] = int.get(i);
}
答案 3 :(得分:0)
任何涉及循环的东西,直到找到足够的唯一随机数,都无法保证完成。如果极不可能的话,随机数发生器永远不会在合理的时间内输出足够的唯一数字。
(我知道这绝不会发生在实践中,但它是理论的可能性。)
一个安全的选择是选择一个随机数,然后在循环中递增它,直到你有足够的数字。
int n = new Random().nextInt(89999 - myArr.length) + 10000;
for (int i = 0; i < myArr.length; i++) {
idArr.add(n++);
}