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

ArrayListの代わりに を使用しarrayます。そうすれば、 メソッドを使用してが既に にあるArrayList#contains(obj)かどうかをテストするだけで済みます。idArrayList

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]);

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

十分な一意の乱数が見つかるまでループすることは、完了する保証がありません。ごくまれに、乱数ジェネレーターが妥当な時間内に十分な数の一意の数値を出力しない可能性があります。

(これが実際には決して起こらないことはわかっていますが、理論上の可能性です。)

安全な代替手段は、1 つの乱数を選択し、十分な数になるまでループ内でインクリメントすることです。

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 に答える