Более эффективный способ хранения ценностей? - PullRequest
3 голосов
/ 22 августа 2011

Я думаю о создании математической программы. Он задаст случайный вопрос из набора вопросов, а затем проверит ответ. Вот что у меня есть:

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};

(Обычно это не так; я сделал это только для того, чтобы показать, какие ответы и на какой вопрос пошли)

Есть ли более эффективный способ сделать это (меня интересует только сохранение данных, не их получение)?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Я бы порекомендовал создать специальный класс для хранения вопроса и ответа, сохранить их в List и использовать Collections.shuffle для перемешивания вопросов.

Использование shuffle предлагает гораздо более равномерное распределение вопросов при каждом запуске приложения по сравнению с положением, в котором HashMap хранит вопросы внутри (что, скорее всего, будет таким же для данной реализации JVM). 1009 *

Кроме того, инкапсуляция вопроса и ответа лучше с точки зрения ОО ИМО.

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.
}
2 голосов
/ 22 августа 2011

Это должно сделать это:

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)];  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...