2017-02-02 4 views
0

今日、先生は私に、ランダムプレゼンテーショントピックピッカーをプログラムするように頼んだ。ランダムプレゼンテーショントピックピッカーがnullを返す

生徒がPCに行ってDialogというメッセージをクリックすると、トピックとトピックの最大インデックスの間の数字がランダムに生成され、それに応じてトピックが印刷されるという考えがありました。

私はHashMapsで試しました。 Stringを一緒にとどまるキーを入れることで、(出力後に)そのエントリを削除して他の生徒が同じトピックを取得できないようにすることができます。

しかし、常に少なくとも1つの空の参照 - > nullを返します。

static HashMap<Integer, String> map = new HashMap<>(); 

public static void main(String[] args){ 

    int anzahlEintraege = Integer.parseInt(JOptionPane.showInputDialog("Wie viele Themen gibt es?")); 

    for(int i = 0; i < anzahlEintraege; i++){ 
     map.put((i+1),JOptionPane.showInputDialog("Geben Sie das Thema Nummer " + (i+1) + " ein!")); 
    } 

    JOptionPane.showMessageDialog(null, "Jetzt geht's Los!"); 

    int max = map.size(); 
    int removed = 0; 
    for(int i = 0; i < max; i++){ 
     Random r = new Random(); 
     int random = r.nextInt(max-1)+1; 

     JOptionPane.showMessageDialog(null, "Sie haben das Thema "+ map.get(random) + " gezogen!"); 
     map.remove(random); 
     removed++; 

    } 
} 
+1

をランダムに削除しないでください:ここで

は、あなたが適応することができるはずの文字列を使用した簡単な例です。もう一度ランダムに選んだ場合は、マップにその項目がないため、nullが返されます。 –

答えて

1

あなたに実行している問題は、あなたがそのキーを持つ要素を既に削除した場合でも、複数回同じ乱数を選ぶことができるということです。ここで

はコードです。

重複しない乱数を選択するのではなく、単純にキーのリストを作成し、その順序をランダム化し、単純に反復処理する方がよいでしょう。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Scratch { 
    public static void main(String[] args) throws Exception { 
     Map<Integer, String> map = new HashMap<>(); 
     map.put(1, "foo"); 
     map.put(2, "bar"); 
     map.put(3, "baz"); 

     List<Integer> keys = new ArrayList<>(map.keySet()); 
     Collections.shuffle(keys); 

     for (Integer key : keys) { 
      String randomValue = map.get(key); 
      System.out.println(randomValue); 
     } 
    } 
}