简体   繁体   English

用Java将逗号分隔的文件读入多维数组

[英]Reading comma delimited file into a multidimensional array in Java

I want to read a list of multiple choice questions into a multidimensional array in Java, the file is in the format: Question,answer1,answer2,answer3,answer4,correctanswer . 我想将选择题列表读入Java的多维数组中,文件格式为: Question,answer1,answer2,answer3,answer4,correctanswer

How many meters are in a kilometer?,1,10,100,1000,4, Which colour isn't in the rainbow nursery rhyme?,Blue,Pink,Black,Orange,3 How many players does a football team have on the pitch?,10,11,12,13,2 一公里有多少米?,1,10,100,1000,4,彩虹童谣中没有哪个颜色?,蓝色,粉红色,黑色,橙色3足球队在场上有多少名球员? ,10,11,12,13,2

And so I want the array to be in the format Question[][] where if n was 1 then Question[n][1] would be the first question in the CSV file, then to select a question I can just change n to whatever I want. 因此,我希望数组的格式为Question [] [],如果n为1,那么Question [n] [1]将是CSV文件中的第一个问题,然后选择一个问题,我只需将n更改为随便我

I don't know how many questions there will be, they will be continuously added or removed from the CSV file so there isn't going to be a static amount. 我不知道会有多少个问题,这些问题会不断从CSV文件中添加或删除,因此不会有一个固定的数量。 So the question is how do I load all of the Questions from the CSV file in a simple way? 因此,问题是如何以一种简单的方式从CSV文件加载所有问题?

The simplest approach is create an ArrayList or arrays. 最简单的方法是创建一个或多个ArrayList This seems complex, but using the ArrayList means you don't have to worry about the amount of questions. 这似乎很复杂,但是使用ArrayList意味着您不必担心问题的数量。

ArrayList<String[]> questions = new ArrayList<String[]>();
// Create the object to contain the questions.

Scanner s = new Scanner(new File("path to file"));
// Create a scanner object to go through each line in the file.

while(s.hasNextLine()) {
   // While lines still exist inside the file that haven't been loaded..
   questions.add(s.nextLine().split(","));
   // Load the array of values, splitting at the comma.
}

In the end, you wind up with an ArrayList object, where each entry is a String[] with the same length as the number of tokens on each line. 最后,您将看到一个ArrayList对象,其中每个条目都是String[] ,其长度与每行上的标记数相同。

Edit 编辑

As mentioned in the comments on this answer, you can simply call the toArray method inside the ArrayList class, to get a multi-dimensional array. 如对此答案的注释中所述,您可以简单地在ArrayList类中调用toArray方法,以获得多维数组。

You will want to set up a nested for loop to handle this: 您将需要设置一个嵌套的for循环来处理此问题:

for(i = 0; i < number_of_questions; i++)
{
    line_array = current_input_line.split(",")
    Questions[i] = line_array[0]
    for(j = 1; j < line_array.length; j++)
    {
        Questions[i][j] = line_array[j];
    }
}

When you get to a point where you have to make a two-dimensional array for data hierarchy, you should probably create a sensible model for it. 当您需要为数据层次结构创建二维数组时,您可能应该为其创建一个明智的模型。

Here is a quick (and dirty) model for you (setters discarded for typing speed): 这是一个适合您的快速(肮脏的)模型(由于打字速度而放弃了设置者):

Questionnaire class: 问卷类别:

/**
 * Facilitates an entire questionnaire
 */
public class Questionnaire extends ArrayList<Question> {

    /**
     * This questionnaire's name
     */
    private String name;

    /**
     * Creates a new questionnaire using the specified name
     * @param name  The name of this questionnaire
     */
    public Questionnaire(String name) {
        this.name = name;
    }

    /**
     * Returns the name of this questionnaire
     */
    public String getName() {
        return name;
    }
}

Question class: 问题类别:

/**
 * Facilitates a question and its answers
 */
public class Question extends ArrayList<Answer> {

    /**
     * The question's text
     */
    private String text;

    /**
     * Constructs a new question using the specified text
     * @param text  The question's text
     */
    public Question(String text) {
        this.text = test;
    }

    /**
     * Returns this question's text
     */
    public String getText() {
        return text;
    }
}

Answer class: 答案类别:

/**
 * Facilitates an answer
 */
public class Answer {

    /**
     * The answer's text
     */
    private String text;

    /**
     * Whether or not this answer is correct
     */
    private boolean correct;

    /**
     * Constructs a new answer using the specified settings
     * @param text          The text of this answer
     * @param correct       Whether or not this answer is correct
     */
    public Answer(String text, boolean correct) {
        this.text = text;
        this.correct = correct;
    }

    /**
     * Returns this answer's text
     */
    public String getText() {
        return text;
    }

    /**
     * Whether or not this answer is correct
     */
    public boolean isCorrect() {
        return correct;
    }
}

Usage for it would be as follows: 用法如下:

// Create a new questionnaire
Questionnaire questionnaire = new Questionnaire("The awesome questionnaire");

// Create a question and add answers to it
Question question = new Question("How awesome is this questionnaire?");
question.add(new Answer("It's pretty awesome", false));
question.add(new Answer("It's really awesome", false));
question.add(new Answer("It's so awesome my mind blows off!", true));

// Add the question to the questionnaire
questionnaire.add(question);

Iterating over it is pretty easy: 对其进行迭代非常简单:

// Iterate over the questions within the questionnaire
for(Question question : questionnaire) {
    // Print the question's text
    System.out.println(question.getText());

    // Go over each answer in this question
    for(Answer answer : question) {
        // Print the question's text
        System.out.println(answer.getText());
    }
}

You could also iterate just a part of it: 您也可以只迭代其中一部分:

// Iterate over the third to fifth question
for (int questionIndex = 2; questionIndex < 5; questionIndex ++) {
    // Get the current question
    Question question = questionnaire.get(questionIndex);

    // Iterate over all of the answers
    for (int answerIndex = 0; answerIndex < question.size(); answerIndex++) {
        // Get the current answer
        Answer answer = question.get(answerIndex);
    }
}

Reading a file into the model using the format you described can be done the following way: 使用您描述的格式将文件读入模型可以通过以下方式完成:

// Create a new questionnaire
Questionnaire questionnaire = new Questionnaire("My awesome questionnaire");

// Lets scan the file and load it up to the questionnaire
Scanner scanner = new Scanner(new File("myfile.txt"));

// Read lines from that file and split it into tokens
String line, tokens[];
int tokenIndex;
while (scanner.hasNextLine() && (line = scanner.nextLine()) != null) {
    tokens = line.split(",");

    // Create the question taking the first token as its text
    Question question = new Question(tokens[0]);

    // Go over the tokens, from the first index to the one before last
    for (tokenIndex = 1; tokenIndex < tokens.length-1; tokenIndex++) {
        // Add the incorrect answer to the question
        question.add(new Answer(tokens[tokenIndex], false));
    }

    // Add the last question (correct one)
    question.add(new Answer(tokens[tokenIndex],true));
}

// Tada! questionnaire is now a complete questionnaire.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM