为了账号安全,请及时绑定邮箱和手机立即绑定

使用 ArrayList<String> 将文本文件解析为字符串,用于问答结构化应用程序

使用 ArrayList<String> 将文本文件解析为字符串,用于问答结构化应用程序

ibeautiful 2022-08-03 12:51:30
这是我的第一篇文章,但我会直截了当。我正在尝试用Java做一个测验。我的应用程序在当前状态下,从文本文件中读取问题,按换行符拆分问题,返回数据并使用扫描仪循环访问列表以检查输入以与存储的答案进行比较...好吧,还不是后一点。一切都很好,但问题是我只有问题。我无法思考如何在文本文件中构建问题和答案,然后将其分解为某种可以在控制台中呈现给用户的数组结构。所以,基本上,我想把问题,答案选择和正确答案都存储在一行上......或者,我可以以有效的方式完成所有这三件事。我假设我会用换行符来分隔,然后用其他一些字符来分隔我需要的每行的三个部分。我该从那里去哪里,如何?一旦我把它全部分解,我该如何跟踪哪个去哪里?我对短篇小说的方法表示歉意。我到处寻找适合我需求的指南或教程。我也应该警告你...我对Java很陌生,我知道有更好的方法来做我需要的事情,所以,请......以一种新人可以理解的方式为我分解它。我希望这一切都是有道理的。如果这在其他地方重复或太宽泛,请指导我去哪里,以便我可以学习。无论如何,这是我的代码!问题数组.javaimport 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.javaimport 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();    }}
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

首先,您需要确定文本文件的结构。这是你如何做到这一点。


示例文本文件:


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.

现在你有一个有点动态的问答程序。如果要添加/删除问题,则只需修改文本文件即可。请随时发表评论以进行澄清和提出问题。


查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信