如何自动将用户定义的对象存储到地图中?

时间:2019-03-31 13:15:43

标签: java class dictionary object constructor

我正在创建一个小程序,它允许您插入自己的多项选择题,并且可以通过其他方法询问您这些问题。 因此,我使用构造函数,toString()方法和可以向我提出这些问题的方法来设置“问题类”。我现在的问题是,我必须以某种方式存储问题,因为问题参数之一是整数“ priority”(优先级),如果您回答对还是错,它都会改变。

我想到了一个地图,如下图所示,但我不知道如何正确设置它,因此它会自动将一个新创建的问题存储到该地图中。也许我必须创建另一个方法来执行此操作,但是我想找到一种排除调用额外方法的方法。下面的代码显示了如何在main方法,Question类的数据字段和构造函数中创建一个新问题。

因此在此示例中,我想将问题编号1保存到Map数据库中。我不想手动操作。

public static void main(String[] args) {

Question number1 = new Question("What is the right answer?",
            new String[] { "1", "2", "3", "4" }, 3, 1.0);
}

public class Question {

public String question;
public String[] answers;
public int solution;
public double priority;
public static Map<Integer, Question> Database = new TreeMap<Integer,Question>();

public Question(String que, String[] ans, int sol, double prio){
this.question = que;
this.answers = ans;
this.solution = sol;
this.priority = prio;

}

2 个答案:

答案 0 :(得分:1)

根据您的评论,将其自动插入地图中:

public class Question {

   static int keyCount; 

   public Question(String que, String[] ans, int sol, double prio){
      this.question = que;
      this.answers = ans;
      this.solution = sol;
      this.priority = prio;
      Database.put(++keyCount, this);
   }

}

在这里,我们每次创建新对象时都会在地图 中插入一个条目。

  1. this是指创建的当前对象。
  2. 静态变量keyCount用于增加变量的值。 键每次创建

答案 1 :(得分:0)

我建议不要在构造函数内部将对象添加到Map中。原因之一是单一责任原则。您的构造函数将做两件事(初始化一个对象并将其添加到Map中)。这是一种不好的做法,尤其是因为方法的名称(在您的情况下为构造函数)并未明确说明其功能。 另一个原因是在构造函数中使用“ this”。您应该非常小心,因为它可能导致难以调试的问题。原因是:当您仍在构造函数中时,您的对象(因此“ this”)尚未完全初始化。因此,您要将未完全初始化为参数的对象传递给方法。正如我所说,这可能会导致大问题。

如果您真的需要一劳永逸,可以在类中创建一个静态方法,如下所示:

   public static addQuestion(String que, String[] ans, int sol, double prio){
      int key = Database.size();
      Database.put(key, new Question (que, ans, sol, prio));
   }

然后可以这样称呼它:

   Question.addQuestion("What is the right answer?",
            new String[] { "1", "2", "3", "4" }, 3, 1.0);