2015-11-11 2 views
0

Я пытаюсь сделать программу викторины в java, используя netbeans для школьного проекта. У меня около 40 вопросов и их нужно хранить в двухмерном массиве.
String qna[][]=new String[40][5];\\ for the question and each of the four options which will be displayed on 4 toggle buttons
Моя проблема заключается в том, что я должен набирать большое количество кода для загрузки каждого вопроса и его «четырех вариантов, и это сложно, когда мне нужно редактировать квесты.
Есть ли более эффективный способ сделать это (например, с использованием текстового документа или чего-то еще в другом месте)?Хранение многих строк в двумерном массиве String

+0

Вы можете просто сохранить каждый 'question' и' options' в текстовом файле (специально отформатированном) и прочитать его оттуда. – 3kings

+2

Почему бы вам не создать класс со строкой вопросов и 4 параметрами. Затем вы можете создать массив объектов этого класса. – Atri

+0

@ 3kings, как я могу это сделать? –

ответ

2

Вы не должны использовать 2D-массив для хранения вопросов и ответов, это плохо и хрупко!

Вы можете создать класс под названием CompoundQuestion, содержащий ответы на вопросы и задание, а затем создайте объекты CompoundQuestion. Класс должен быть примерно таким:

public class CompoundQuestion { 
    private String question; 
    private String[] answers; 

    public String getQuestion() { return question; } 

    public String[] getAnswers() { return answers; } 

    public CompoundQuestion (String question, String[] answers) { 
     this.question = question; 
     this.answers = answers; 
    } 

    public CompoundQuestion (String question, String... answers) { 
     this(question, answers); 
    } 
} 

Вышесказанное является просто простой реализацией. Если вы не понимаете концепцию классов, прочитать:

https://docs.oracle.com/javase/tutorial/java/javaOO/classes.html

Если вы не знаете, что String... вещь делает, прочитать:

https://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

Если вы все еще не понимаю, просто используйте первую перегрузку конструктора.

И вы можете использовать свой класс, как это (Предполагая, что вы поняли String... часть):

CompoundQuestion myQuestion = new CompoundQuestion ("Is Sweeper handsome?", "Yes!", "YASSS", "Yeeeeeeeesssss"); 

И тогда вы можете хранить это в массиве:

CompoundQuestion[] questionArray = new CompoundQuestion[40]; 

Конечно, вы можете получите текст вопросов и ответы по телефону:

getQuestion() 

и

getAnswers() 

Если вы не понимаете классы, просто используйте 2D-массив ... Я потерял дар речи.

Только в случае, если вы хотите сохранить правильный ответ, вы можете добавить код в CompoundQuestion класс:

private int correctAnswer; 
public String getCorrectAnswer() { 
    return answers[correctAnswer]; 
} 

И вы можете добавить, что в конструктор, как хорошо!


EDIT:

Вы можете также поместить CompoundQuestion в текстовый файл, так что вы можете сохранить его даже после того, как программа закончила!

Использовать ObjectInputStream и ObjectOutputStream. Последний для «сериализации» CompoundQuestion в файле на вашем компьютере! И используйте первый, чтобы десериализовать его обратно на объект CompoundQuestion.

Более подробная информация здесь:

ObjectInputStream: http://www.tutorialspoint.com/java/io/java_io_objectinputstream.htm

ObjectOutputStream: http://www.tutorialspoint.com/java/io/java_io_objectoutputstream.htm

+0

OP, кстати, если вы действительно хотите более простую реализацию, просто объявите кучу переменных в классе. В принципе, нет геттеров, нет конструкторов и нет инкапсуляции. Это проще, но плохая практика. Выбирай с умом! – Sweeper

+0

Я добавил некоторую информацию о том, как сохранить вещь в файле для реализации _late binding_. Таким образом, программе не нужно инициализировать все 40 вопросов с помощью конструктора. Он может просто прочитать их из файла. Однако файл находится в двоичном формате, поэтому не пытайтесь его редактировать! – Sweeper

0

Вместо использования мути-мерных массивов создайте класс QnA для хранения вопросов и соответствующих вариантов ответа.

class QnA { 
    String question; 
    String[] answer_options; 
} 

магазин ваши вопросы (и соответствующие ответы) в формате JSON (текстовый файл)

[ { "вопрос": "Как ты", "answer_options": [ "Bad", " OK», "ХОРОШО"] }, { "вопрос": "Какого цвета небо", "answer_options": [ "Синий", "Зеленый", "Красный"] } ]

Используя этот файл popul съели и массив объектов QnA, таких как QnA[] Qestions.

Существует много libraries to parse json.

0

Как о создании класса Вопроса, который хранит вопрос и все эти ответы?

class Question { 

private String question; 

private List<String> answers; 

Question(String question) { 
    this.question=question; 
    answers = new ArrayList<>(); 
} 

public void addAnswer(String answer){ 
    this.answers.add(answer); 
} 
//Getters 
} 

Тогда вы могли бы создать класс, который считывает из текстового файла и создает список всех вопросов, используя BufferedReader так:

public class QuestionLoader { 

//Pass the path to your file as the parameter 
public List<Question> loadFromFile(String path) { 
    List<Question> allquestions = new ArrayList<>(); 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader(new File(path))); 
     Question question = null; 
     String line = br.readLine(); 
     while (line != null) { 
      if (line.startsWith("Q::")) { 

       question = new Question(line.split("::")[1]); 
      } else if (line.startsWith("A::")) { 
       question.addAnswer(line.split("::")[1]); 
      } else if (line.equals("")) { 
       allquestions.add(question); 
      } 
      line = br.readLine(); 
     } 
     br.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(QuestionLoader.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(QuestionLoader.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return allquestions; 
} 

}

Она считывает из файла структурированные как

Q::What is the meaning of life? 
A::42 
A::33 
A::pi 
A::all of the above 

Q::What? 
A::Nothing 
A::Something 

Просто отдельные вопросы друг от друга по новой линии. Таким образом, вам не нужно будет менять код, если вам потребуется произвольное количество вопросов или ответов. Это может быть не самый эффективный, но мне удобнее работать со списками, чем с массивами.

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