2012-03-05 12 views
0

私はちょうど非常に単純な問題に遭遇しました。生徒に割り当てるべき整数値(例えばタイムスロット)があるとします。各生徒はタイムスロット割り当てのリクエストを送信し、ランダムに割り当てられます。タイムスロット割り当て - 設計とアプローチ

私は次のようであることをacievingを考えていた

List<Integer> possibleSlots; 
Map<Integer, Student> allocatedSlots; 

今私は同じようSTHを行うだろう各要求に対して次のアプローチはのための一般的なシナリオとして適しかなったのだろう

Random r = new Random(); 
int slot = possibleSlots.removeAt(r.next(possibleSlots.size())); 
allocatedSlots.put(slot, student); 

スロットを無作為に割り振り、誰がどのスロットを持っているか、または可能なスロットのリストを使わずにより良い方法があるかに関する情報を保持していますか?

答えて

1

スロットが不足していないかどうかを確認する必要があります。

あなたはおそらく必要があります。

r.nextInt(possibleSlots.size()) 

あなたが整数のインデックスを必要とするので。

割り当てごとに新しいランダムは必要ありません.1つしか作成せずに再利用することができます。

それ以外の場合は、スレッドが1つしかない場合は妥当と思われます。上記の方法は、追加作業なしでスレッドセーフではありません。

1

スロットの実際のリストを保持せずにランダムスロットリストを生成したい場合は、ある種のグローバルに一意の識別子と順序付けを併用することを検討できます。

たとえば、各生徒にUUID.randomUUID()を割り当てることができます。次に、それらがどの順序であるかを調べる必要があるときは、自然順序付けに従ってUUIDを比較してください。

UUIDは統計的にグローバルに一意であることが保証されているため、2人の生徒が同じものを取得することはありません。また、注文をしているので、後でいつでもリストを作成することができます。

関連する問題