今天我的老师让我为他编写一个随机演示主题选择器。
这个想法是,学生去电脑并点击消息Dialog,然后随机生成1到主题的最大索引之间的数字,然后打印相应的主题。
我用HashMaps尝试过。放入与String一起保留的键,以便我可以(在输出之后)删除该条目,以便其他学生不能获得相同的主题。
但它始终返回至少1个空引用 - >空。
以下是代码:
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++;
}
}
答案 0 :(得分: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);
}
}
}