java - 无法从 HashMap 中删除随机选择的值

标签 java swing hashmap

我准备了一个受 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/

相关文章:

Java Keytool jdk/jre 64/32bit - 有区别吗?

java - 我不明白这里的错误。是括号吗? Eclipse Java 7

java - 将对象存储为映射中的键

java - 当我将一个列表子列出到多个新列表中时,我丢失了项目。如何在不丢失数据的情况下子列表?

java - 在构建过程中集成系统测试

java - 在 Java 中转换泛型类型(例如 T value = (T) inputParam)

java - 如何在运行时从类类型实例化一个类?

Java Swing 如何检测列表选择事件

java - 使用 BorderLayout 创建两个偶数列

java - 如果替换给定键的旧值,put 方法是否会增加 "modCount"?