Разбор текстового файла в строки с ArrayList <String>для структурированного приложения Q & A - PullRequest
0 голосов
/ 12 марта 2019

Это мой первый пост, но я подойду к делу.

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

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

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

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

Надеюсь, все это имело смысл. Если это дублируется в другом месте или слишком широко, пожалуйста, укажите мне, куда идти, чтобы я мог учиться. В любом случае, вот мой код!

QuestionArray.java

import java.util.ArrayList;
public class QuestionArray {
    private static ArrayList<String> list = new ArrayList<String>();
    public static Object[] processFile() {
        String file = FileStuff.fileAsString("res/questions/questions.txt");
        String[] lines = file.split("\n");
        for (int i = 0; i < lines.length; i++) {
            list.add(lines[i]);
        } return list.toArray();
    }
}

FileStuff.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.FileReader;
public class TextFileStuff {
    public static String fileAsString(String path) {
        StringBuilder builder = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(path));
            String line;
            while((line = br.readLine()) != null)
                builder.append(line + "\n");
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        } return builder.toString();
    }
}

Quiz.java

import java.util.Scanner;
public class Quiz {
    private static Object[] questionArray;
    public static void main(String[] args) {
        questionArray = QuestionArray.processFile();
        takeTheQuiz(questionArray);
    }
    public static void takeTheQuiz(Object[] questions) {
        int score = 0;
        Scanner userInput = new Scanner(System.in);
        for(int i = 0; i < questions.length; i++) {
            System.out.println(questions[i]);
            String answer = userInput.nextLine().toLowerCase();
            if(answer.equals("")) {
                score++;
            }
        } 
        System.out.println("You scored "+score+" out of "+questions.length); 
        if(score <= 2) {
            System.out.println("You suuuuck."); 
        } else {
            System.out.println("Mediocre performance.");
        }
        userInput.close();
    }
}

1 Ответ

0 голосов
/ 12 марта 2019

Сначала вам нужно определиться со структурой вашего текстового файла.Вот как вы можете это сделать.

Пример текстового файла:

3
%%%
@@@ 
&&&
What is Java?%%%a. Food@@@b. Programming Language@@@c. Person%%%b
Is this a question?%%%a. Yes@@@b. No@@@c. Maybe%%%a
Are you correct?%%%a. Yes@@@b. No@@@c. Maybe%%%c

3 - это количество вопросов в файле
%%% - это разделитель длячасти вопроса
@@@ - это разделитель для частей выбора
&&& - это разделитель для частей ответов (если есть вопросы с несколькими ответами)
Последующие части являются вопросами.Формат: (question part)%%%(choice part)%%%(answer part)

Поскольку существует множество возможных вариантов, вы можете отформатировать возможный выбор следующим образом: (choice a)@@@(choice b)@@@(choice c) это (choice part) сверху.

Так как естьвозможно много возможных ответов, вы можете отформатировать возможные ответы следующим образом: (answer a)@@@(answer b)@@@(answer c) это (answer part) сверху.

Как только вы определились, как выглядит ваш текстовый файл, вы можете создать класс, который будет содержатьэти вопросы, выбор и ответы.Вот пример:

public class Question {
    private String question; // This will hold the question
    private String[] choices;// This will hold the choices
    private String[] answers;// This will hold the correct answer/s, I made it an array since there might be
                                // a question that has multiple answers

    public Question(String question, String[] choices, String[] answers) {
        this.question = question;
        this.choices = choices;
        this.answers = answers;

    }

    /**
     * @return the question
     */
    public String getQuestion() {
        return question;
    }

    /**
     * @param question
     *            the question to set
     */
    public void setQuestion(String question) {
        this.question = question;
    }

    /**
     * @return the choices
     */
    public String[] getChoices() {
        return choices;
    }

    /**
     * @param choices
     *            the choices to set
     */
    public void setChoices(String[] choices) {
        this.choices = choices;
    }

    /**
     * @return the answer
     */
    public String[] getAnswers() {
        return answers;
    }

    /**
     * @param answer
     *            the answer to set
     */
    public void setAnswer(String[] answer) {
        this.answers = answer;
    }

}

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TextFileStuff {

    public static Question[] fileAsString(String path) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(path));
            String line = br.readLine(); // get the number of questions
            Question[] questionList = new Question[Integer.parseInt(line)]; // initialize the question array
            String partsDelimiter = br.readLine(); // get the delimiter for the question parts
            String choicesDelimiter = br.readLine(); // get the delimiter for the choices
            String answersDelimiter = br.readLine(); // get the delimiter for the answers
            int questionNumber = 0; // initialize the question number
            while ((line = br.readLine()) != null) { // loop through the file to get the questions
                if (!line.trim().isEmpty()) {
                    String[] questionParts = line.split(partsDelimiter); // split the line to get the parts of the
                                                                            // question
                    String question = questionParts[0]; // get the question
                    String[] choices = questionParts[1].split(choicesDelimiter); // get the choices
                    String[] answers = questionParts[2].split(answersDelimiter); // get the answers
                    Question q = new Question(question, choices, answers); // declare and initialize the question
                    questionList[questionNumber] = q; // add the question to the question list
                    questionNumber++; // increment the question number
                }
            }
            br.close();

            return questionList;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String path = "\\Test\\src\\res\\questions.txt"; // the path of the text file
                                                                                            // that contains the
                                                                                            // questions
        Question[] questionList = TextFileStuff.fileAsString(path);
        takeTheQuiz(questionList);
    }

    public static void takeTheQuiz(Question[] questions) {
        int score = 0;
        Scanner userInput = new Scanner(System.in);
        for (int i = 0; i < questions.length; i++) {
            System.out.print("======================");
            System.out.print("Question " + (i + 1));
            System.out.println("======================");
            System.out.println(questions[i].getQuestion()); // Print the question
            String[] choices = questions[i].getChoices(); // get the choices
            for (int j = 0; j < choices.length; j++) { // loop through the choices
                System.out.println(choices[j]); // Print the choices
            }
            System.out.print("Input an answer : "); // Print the choices
            String answer = userInput.nextLine().toLowerCase();
            String[] answers = questions[i].getAnswers(); // get the answers
            for (int j = 0; j < answers.length; j++) { // loop through the answers
                if (answer.equals(answers[j])) { // check if the user's answer is correct
                    score++; // increment score
                }
            }
        }
        System.out.println("You scored " + score + " out of " + questions.length);
        if (score == questions.length) {
            System.out.println("Cheater!");
        } else if (score <= 2) {
            System.out.println("You suuuuck.");
        } else {
            System.out.println("Mediocre performance.");
        }
        userInput.close();
    }

}

Вот пример выходных данных программы:

======================Question 1======================
What is Java?
a. Food
b. Programming Language
c. Person
Input an answer : a
======================Question 2======================
Is this a question?
a. Yes
b. No
c. Maybe
Input an answer : v
======================Question 3======================
Are you correct?
a. Yes
b. No
c. Maybe
Input an answer : a
You scored 0 out of 3
You suuuuck.

Теперь у вас есть несколько динамичная программа вопросов и ответов.Если вы хотите добавить / удалить вопрос, вам просто нужно изменить текстовый файл.Не стесняйтесь комментировать для разъяснений и вопросов.

...