【问题标题】:More efficient way to store values?更有效的值存储方式?
【发布时间】:2011-10-31 17:39:23
【问题描述】:

我正在考虑制作一个数学程序。它会从一组问题中随机提出一个问题,然后验证答案。这是我目前所拥有的:

String[] questions = {"3 * 19", "21 * 9", "7 * 4", "349274 * 0", "16 / 2", "3 + 86", "5 - 9"};
int[] answers =      {57,        189,       28,         0,           8,       89,      -4};

(通常不是这样间隔的;我这样做只是为了显示哪个答案与哪个问题相关)

有没有更有效的方法来做到这一点(我只对存储数据感兴趣,检索它)?

【问题讨论】:

  • 您现在如何存储它?你在看什么效率低下?磁盘空间?序列化时间?还有什么?

标签: java store


【解决方案1】:

应该这样做:

Map<String,Integer> map = new HashMap<String, Integer>(){{     
    put("3 * 19", 57);     
    put("21 * 9", 189);     
    put("7 * 4", 28);     
    put("349274 * 0", 0);
    put("16 / 2", 8);
    put("3 + 86", 89);
    put("5 - 9", -4); 
}};

@Bruno Reis 的简短说明:

请注意,这会创建一个继承自 HashMap 的匿名内部类。因此,它对创建它的类的实例有一个(非瞬态)引用,如果您尝试序列化映射,这可能会造成问题。

更新:以下是检索随机问题值的方法:

Random generator = new Random();
Object[] values = map.values().toArray();
int randomAns = values[generator.nextInt(value.length)];  

【讨论】:

  • 为什么我不能投票???谢谢!这看起来更有效率! :D 我会尽快接受!
  • 请注意,这会创建一个继承自 HashMap 的匿名内部类。因此,它对创建它的类的实例有一个(非瞬态)引用,如果您尝试序列化映射,这可能会造成问题。
  • @Tony:这不是更有效。老实说,您的问题不是很清楚,但是由于您似乎在问什么更节省空间,所以您最初的想法更是如此。
  • 你将如何从地图中随机选择问题?
  • @Adamski Tony 只对检索值感兴趣。
【解决方案2】:

我的建议是创建一个专门的类来存储问题和答案,将它们存储在List 中,然后使用Collections.shuffle 来打乱问题。

与依赖HashMap 在内部存储问题的顺序相比,使用shuffle 可以在每次应用程序运行时提供更加均匀的问题分布(对于给定的JVM 实现,这很可能是相同的)。

此外,从 OO 的角度来看,IMO 将问题和答案封装在一起会更好。

public class Question {
  private final String question;
  private final int answer;

  public Question(String question, int answer) {
    this.question = question;
    this.answer = answer;
  }

  public String getQuestion() { return question; }
  public int getAnswer() { return answer; }
}

然后填充问题列表、随机播放和迭代:

// Use ArrayList as it supports random access for efficient element swapping:
List<Question> questions = new ArrayList<Question>();

questions.add(new Question("3 * 19", 57));
// etc.

Collections.shuffle(questions);

for (Question qn : questions) {
  System.out.println(qn.getQuestion());
  // Prompt for answer, etc.
}

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2019-07-09
    • 2019-03-05
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多