2013-12-19 3 views
1

Я беру вопросы из пользовательского ввода, который сканируется для информации, и я сохраняю информацию и исходный вопрос.Java чтение прошлых сохраненных переменных

Каков наилучший способ сохранить вопрос +, чтобы он мог быть вызван, чтобы я мог прочитать X вопросов до того, как заданный вопрос и получить информацию/переменные на нем?

An example: 

[User]"what is 1+1?" 
[Reply]"two" 
save information: "what is 1+1","two" 

[User]"how is the dog?" 
[Reply]"fine" 
save information:"how is the dog?",subject = "dog", condition = "fine" 

getQuestion(1) -> "what is 1+1?" 
getInformation(current) -> subject = "dog" condition = "fine" 

Кроме того, что было бы лучше назвать эту информацию для каждого вопроса, используя, в Int (вопрос X), строка (вопрос) или другой?

код до сих пор:

Map<String,String> variable = new HashMap<>(); 
    public QuestionInfo(String name,String variable) { 
     this.variable.put(name, variable); 
    } 
    public String get(String name){ 
    if(variable.containsKey(name)) { 
     return variable.get(name); 
    } else { 
     return ""; 
    } 
    } 

Я хотя об использовании:

Map<String,QuestionInfo> Questions = new HashMap<>(); 

первый, но затем, если я хотел назвать я не могу использовать INT так вместо этого:

Map<Integer,QuestionInfo> Questions = new HashMap<>(); 

, тогда я могу добавить вопрос в качестве первой части информации.

+0

Ваша забота о том, какую структуру использовать? или где хранить их в заданном типе приложения? – VirtualTroll

+0

Да, я хочу услышать мнение других людей о том, что они выглядят лучше, чем мои, и я не уверен, следует ли сохранять их как одиночные .txt или отдельные. – Greg

+0

Я предполагаю, что вы считаете, что «Map 'для возможности поиска информации по строке вопроса. Если это полезно, вы можете создать как «Map », так и «List », и когда вы создадите новый экземпляр 'QuestionInfo', добавьте его как к карте, так и к списку. Затем вы сможете искать ответы как по индексу int, так и по строке вопросов. – hinerm

ответ

2

Так как вы хотите, чтобы сохранить порядок ответов, вы, вероятно, хотите использовать a List.

Тогда вам просто нужно решить, какой список нужно сделать. Поскольку у вас есть два пункта, которые тесно связаны между собой - предмет (строка) и условие - я бы, вероятно, создать пользовательский класс:

import java.util.Map; 
public class QuestionInfo { 

    private String question; 
    private Map<String, String> variables; 

    public QuestionInfo(String question, Map<String, String> variables) { 
     this.question = question; 
     this.variables = variables; 
    } 

    public String question() { 
     return question; 
    } 

    public Map<String, String> vars() { 
     return variables; 
    } 
} 

Тогда вы бы создать свой список, чтобы хранить их, как это, например:

List<QuestionInfo> questionList = new ArrayList<QuestionInfo>(); 

есть другие способы, чтобы хранить эти строки (например, вы могли бы объединить их с разделителем, или использовать строку [2]) .. но это, вероятно, будет легче читать и понимать позже, в мое мнение.

Вот приближение того, что пользователь должен ввести, и как вы будете использовать questionList + QuestionInfo для хранения данных:

[Пользователь] «как это собака?» [Ответить] "отлично"

Map<String, String> varMap = new HashMap<String, String>(); 
varMap.put("subject", "dog"); 
varMap.put("condition", "fine"); 
questionList.add(new QuestionInfo("how is the dog?", varMap)); 

Теперь вы можете получить доступ к этой информации с помощью:

questionList.get(0).question() // returns "how is the dog?" 

или

questionList.get(0).vars().get("condition") // returns "fine" 

Заметим, что это замазывания код на самом деле собираю пользовательский ввод.

Есть и другие возможности. Вы можете передать в String... конструктору QuestionInfo и проанализировать переменные/создать карту там, например. Вы также можете захотеть сохранить весь ответ в виде строки, отдельной от переменных. Вы также можете создать перечисление для ключей, если у вас есть последовательный набор ключей, которые вы будете заполнять.

+0

Как может быть любое количество переменных с любым именем, которое нужно сохранить, я могу заменить «String subject, String response» на «String ... variables», однако как я могу затем получить эти данные, используя * unknownVariableName *()? – Greg

+0

Если я правильно вас понимаю, я думаю, вы пытаетесь сделать слишком много сразу. Вы должны создать новый 'QuestionInfo' для каждой пары вопросов и ответов. Использование списка заботится о том, что существует множество вопросов и ответов. Я добавлю пример использования в свой первоначальный ответ. – hinerm

+0

Да, я думаю, что я, однако, я думаю, вы неправильно поняли, что я имел в виду. Вопрос и ответ не являются парами, ответ на часть информации, хранящейся в вопросе. Он должен иметь возможность называть имя каждой части информации индивидуально для каждого вопроса. Я обновляю вопрос с помощью кода, который у меня есть до сих пор. – Greg

0

Я думаю, что просто создаю класс «Вопрос», который сохранит фактический вопрос и информацию, которую вы хотите (тема, условие и т. Д.), И просто сохраните их в массиве.

Некоторый код, добавив свой комментарий о том, несколько ответов (он отсутствует в сеттеры, но я думаю, вы получите идею):

public class Question { 
    private String subject; 
    private List<String> responses; 

    public String getSubject(){ 
     return subject; 
    } 
    public String getResponse(int _index){ 
     if (_index <= response.size()) 
     { 
      return response.get(_index); 
     } 
     return ""; 
    } 
} 
+0

Звучит неплохо, но каждый вопрос может иметь другое неизвестное количество переменных, которые могут вызвать проблемы. Я должен иметь массив, каждый элемент которого имеет отдельный массив. Я считаю, что это возможно хотя бы – Greg

Смежные вопросы