我准备了一个受 Trivia Crack 启发的项目。
SporHmap 是一个存储 3 个值(问题)的 HashMap。在 actionListener 方法中,程序从 Hashmap 中获取随机键,并将问题和答案打印到 QuestionClass 的 JLabels 和 JButton。
这里的问题是,我不想重复这些问题。如果已显示问题,则不应再次显示。我在选择值后使用了 tl.SporHmap.remove(randomValue); 但它没有改变任何东西。
TriviaLinked tl = new TriviaLinked();
tl.SporHmap.put("Basketbolda 3 adımdan fazla atılan adıma ne denir?","Steps");
tl.SporHmap.put("Hindistan'ın ulusal sporu nedir?","Kriket");
tl.SporHmap.put("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?","Salih Dursun");
Spor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
QuestionClass q = new QuestionClass();
q.getQFrame();
Object[] values = tl.SporHmap.values().toArray();
String randomValue = (String)values[r.nextInt(values.length)];
if(tl.SporHmap.get("Hindistan'ın ulusal sporu nedir?").equals(randomValue)){
q.label.setText("Hindistan'ın ulusal sporu nedir?");
q.answer1.setText("Kriket");
q.answer2.setText("Beyzbol");
q.answer3.setText("Hokey");
q.answer4.setText("Futbol");
tl.SporHmap.remove(randomValue);
q.answer1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "True Answer");
score.setText("Score: "+scr++);
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
}
else if(tl.SporHmap.get("Basketbolda 3 adımdan fazla atılan adıma ne denir?").equals(randomValue)){
q.label.setText("Basketbolda 3 adımdan fazla atılan adıma ne denir?");
q.answer1.setText("Serbest atış");
q.answer2.setText("Dışarı çıkış");
q.answer3.setText("Steps");
q.answer4.setText("Faul");
tl.SporHmap.remove(randomValue);
q.answer3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "True Answer");
score.setText("Score: "+scr++);
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
}
else if(tl.SporHmap.get("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?").equals(randomValue)){
q.label.setText("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?");
q.answer1.setText("Erkan Zengin");
q.answer2.setText("Özer Hurmacı");
q.answer3.setText("Salih Dursun");
q.answer4.setText("Aykut Demir");
tl.SporHmap.remove(randomValue);
q.answer3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "True Answer");
score.setText("Score: "+scr++);
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
q.answer4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Wrong Answer");
q.getQFrame().dispose();
Spor.doClick();
}
});
}
}
});
这是我的 QuestionClass 类(class):
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class QuestionClass {
public JLabel label,label1;
public JFrame questionFrame;
public JButton answer1,answer2,answer3,answer4;
public QuestionClass() {
questionFrame = new JFrame();
questionFrame.setDefaultCloseOperation(questionFrame.HIDE_ON_CLOSE);
questionFrame.setLayout(new GridLayout(3,2));
questionFrame.setSize(700, 350);
questionFrame.setVisible(true);
questionFrame.setLocationRelativeTo(null);
label = new JLabel("");
questionFrame.add(label);
label1 = new JLabel("");
questionFrame.add(label1);
answer1 = new JButton("");
questionFrame.add(answer1);
answer2 = new JButton("");
questionFrame.add(answer2);
answer3 = new JButton("");
questionFrame.add(answer3);
answer4 = new JButton("");
questionFrame.add(answer4);
}
public JFrame getQFrame() {
return questionFrame;
}
}
最佳答案
你的做法是正确的:提出问题后;从 map 上删除它。
换句话说:只需在 map 上填满足够多的问题即可查看;随机选择它们;提出问题后,remove() map 上相应的键。
但是你好像在打电话
tl.SporHmap.remove(randomValue);
仅适用于您的一个潜在案例。不应存在删除的条件。您随机选择一个问题,然后将其删除!
除此之外:您的“对象”模型不太好。拥有该 map 是没有意义的,但是可以使用 if/else 来进行选择!相反:您可以创建一个 QuizzQuestion 类,并且 QuizzQuestion 具有:
- 问题文本本身
- 正确答案
- 其他(错误)答案
使用该类,您可以将所有属于一起的值放入这样的 QuizQuestion 对象中。
然后你也不需要 map ;只是一个List<QuizzQuestion>
对象就可以了!
鉴于您的评论:基本上,这些可能是您问题的可能根本原因:
- 如前所述;你不
remove
对于所有可能的情况 - 您意外地“重新初始化”了 HashMap(意思是:您实际上删除了该值;但之后又重新创建或重新填充了整个映射)
- 一个概念错误:你假设你的程序应该记住它的最后状态;这样当您关闭程序并重新开始时;它不应显示先前运行中显示的问题。这对你来说是一个误解。
关于java - 无法从 HashMap 中删除随机选择的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574832/