1

我有以下代码生成 5 位随机数并将它们添加到 ArrayList。然而,这些数字必须是唯一的 ID。

for(int i = 0; i < myArr.length; i++) {
    int id = (int) (Math.round(Math.random() * 89999) + 10000);
    idArr.add(id);
}

我正在尝试弄清楚如何在添加之前检查该数字是否已经在数组中,但我无法找到最好的方法来做到这一点。

4

4 回答 4

3

不要使用 (Array)List,使用Set

Set<Integer> set = ...;
while (set.size() < myArr.length) {
  set.add(yourRandomNumber);
}
于 2013-02-12T11:02:00.660 回答
1

使用 anArrayList而不是array. 这样你只需要使用ArrayList#contains(obj)方法来测试是否id已经ArrayList存在。

或者,您可以只使用 a HashSet,使用它的HashSet#contains()方法可以更快地工作。

于 2013-02-12T11:01:39.400 回答
1

您可以创建一个Set数字。例如:

Set<Integer> intSet = new HashSet<Integer>();
while(intSet.size() < myArr.length) {
    intSet.add(getNextRandomInt());
}

然后你可以用它做任何事情Set

所以,如果你需要一个数组,只需调用:

Integer[] intArray = intSet.toArray(new Integer[myArr.length]);

或者,如果您需要一个ArrayListorint[]数组:

// 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);
}
于 2013-02-12T11:03:03.730 回答
0

任何涉及循环直到找到足够的唯一随机数的事情都不能保证完成。如果极不可能的话,随机数生成器可能永远不会在合理的时间内输出足够的唯一数。

(我知道这在实践中永远不会发生,但这是理论上的可能性。)

一个安全的替代方法是选择一个随机数,然后在循环中递增它,直到你有足够的数字。

int n = new Random().nextInt(89999 - myArr.length) + 10000;
for (int i = 0; i < myArr.length; i++) {
    idArr.add(n++);
}
于 2013-02-12T11:15:48.727 回答