繁体   English   中英

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

[英]How do I automatically store user defined objects into a map?

我正在创建一个小程序,允许您插入自己的多项选择问题,并可以通过另一种方法向您询问这些问题。 所以我用构造函数、一个 toString() 方法和一个可以问我这些问题的方法设置了我的“问题类”。 我现在的问题是我必须以某种方式存储问题,因为问题参数之一是整数“优先级”,如果您回答正确或错误,它就会改变。

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

所以在这个例子中,我想将问题 number1 保存到 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;

}

根据您的评论,要自动将其插入地图,请使用:

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用于在每次创建对象时增加键的值。

我建议不要将对象添加到构造函数中的 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM