简体   繁体   English

我想制作一个带处理的二维数组

[英]I want to make a 2D array with processing

I'm trying to make a simple quiz app by reading data from a txt file.我正在尝试通过从 txt 文件中读取数据来制作一个简单的测验应用程序。 I don't know how to handle the data.我不知道如何处理数据。

questions.txt问题.txt

questionA?,2,choicesA-1,achoicesA-2,choicesA-3,choicesA-4
questionB?,3,choicesB-1,choicesB-2,choicesB-3,choicesB-4
questionC?,4,choicesC-1,choicesC-2,choicesC-3,choicesC-4

training.pde培训.pde

String lin;
int ln;
String lines[];

void setup() {
  size(500, 500);
  background(255);

  ln=0;
  lines = loadStrings("questions.txt");
}

void draw() {
  lin =lines[ln];
  String[] co = split(lin, ',');
   println(co[0]);
   println(co[1]);
  ln++;
  if (ln == lines.length) noLoop();
}

I want to make a 2D array..我想做一个二维数组..

   println(co[0][0]); //questionA?
   println(co[0][1]); //2

You can use to load and read lines.您可以使用加载和读取行。 Store each line in an Arraylist:将每一行存储在一个 Arraylist 中:

List<String> lines = Collections.emptyList(); 
try {
    lines =  Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8); 
} catch (IOException e) {
    // do something
    e.printStackTrace();
} 

Now for each line in Arraylist, You can split them using the delimeter ',' and do whatever you want with the words:现在,对于 Arraylist 中的每一行,您可以使用分隔符','将它们分开','并使用以下单词做任何您想做的事情:

 for (String line: lines) {
     String[] words = Arrays.stream(line.split(",")).map(String :: trim).toArray();
     System.out.println("Question: " + words[0] + ", Choices: " + words[1] + " " + words[2] + " " + words[3] + " " + words[4]);
 }

You can use something like this:你可以使用这样的东西:

String filename = "path_to_file";
File file = new File(filename);
Scanner data = new Scanner(file);

String line;
List<String[]> questions = new ArrayList<>();
while (data.hasNextLine()) {
     line = data.nextLine();
     questions.add(line.split(","));
}

As you can see, questions is a list of arrays of strings.如您所见,问题是一个字符串数组列表。 Every element of that list corresponds to one line of your file and you can access a line with questions.get(index).该列表的每个元素对应于文件的一行,您可以使用 questions.get(index) 访问一行。 You can also get a specific element of a line with the standard array notation您还可以使用标准数组表示法获取行的特定元素

eg with the example you provided, questions.get(1)[2] will return choicesB-1例如,使用您提供的示例, questions.get(1)[2]将返回choicesB-1

Keep in mind that reading data from plain text (.txt) will always get you a headache.请记住,从纯文本 (.txt) 中读取数据总是会让您头疼。 You should use formats like JSON or YAML to store your data, a good parser is already available with those.你应该使用像 JSON 或 YAML 这样的格式来存储你的数据,一个好的解析器已经可用。

The String parsing options Alberto and devReddit suggested are good (+1). Alberto 和 devReddit 建议的字符串解析选项很好 (+1)。

I'd like to propose restructuring the data as a JSON array :我想建议将数据重组为JSON 数组

[
    {
      "question":"Question A ?",
      "options": [
        "choicesA-1",
        "choicesA-2",
        "choicesA-3",
        "choicesA-4"
        ],
      "selectedIndex":-1,
      "correctIndex":1
    },
    {
      "question":"Question B ?",
      "options": [
        "choicesB-1",
        "choicesB-2",
        "choicesB-3",
        "choicesB-4"
        ],
      "selectedIndex":-1,
      "correctIndex":2
    },
    {
      "question":"Question C ?",
      "options": [
        "choicesC-1",
        "choicesC-2",
        "choicesC-3",
        "choicesC-4"
        ],
      "selectedIndex":-1,
      "correctIndex":3
    }
  ]

If you save it in a new sketch folder as questionnaire.json you could load it and parse (as well as check) the answers with something like this:如果你将它保存在一个新的草图文件夹中作为questionnaire.json .json,你可以加载它并解析(以及检查)答案如下:

// stores currently loaded questions
JSONArray questions;
// the index of the current question
int currentQuestionIndex = 0;
// the questionnaire data at this index (question, options, correct answer(as index), selected answer(as index)) 
JSONObject currentQuestionData;

void setup() {
  size(400, 400);
  // load data
  try {
    questions = loadJSONArray("questionnaire.json");
  }
  catch(Exception e) {
    println("error loading JSON data");
    e.printStackTrace();
    exit();
  }
}

void draw() {
  // get the current question data
  currentQuestionData = questions.getJSONObject(currentQuestionIndex);
  // access the choices associated with this question
  JSONArray currentQuestionOptions = currentQuestionData.getJSONArray("options");

  background(0);
  // render the question
  text(currentQuestionData.getString("question"), 10, 15);
  // ...and the choices
  for (int i = 0; i < currentQuestionOptions.size(); i++) {
    text(currentQuestionOptions.getString(i), 10, 35 + (20 * i));
  }
  // testing view:
  // render user selected index
  text("selected: " + currentQuestionData.getInt("selectedIndex"), 10, 120);
  // render correct index (and choice text)
  text("correct: " + currentQuestionData.getInt("correctIndex") + " = " + currentQuestionOptions.getString(currentQuestionData.getInt("correctIndex")), 10, 150);
  // render match condition (result) 
  text("match: " + (currentQuestionData.getInt("selectedIndex") == currentQuestionData.getInt("correctIndex")), 10, 180);
}

void keyPressed() {
  // control question with left/right keys
  if (keyCode == LEFT && currentQuestionIndex > 0) currentQuestionIndex--;
  if (keyCode == RIGHT && currentQuestionIndex < questions.size() - 1) currentQuestionIndex++;
  // set user answers on 1,2,3,4 keys
  if (key == '1') currentQuestionData.setInt("selectedIndex", 0);
  if (key == '2') currentQuestionData.setInt("selectedIndex", 1);
  if (key == '3') currentQuestionData.setInt("selectedIndex", 2);
  if (key == '4') currentQuestionData.setInt("selectedIndex", 3);
}

It's quite a bit of code, because on top of showing how to parse and render the question/choices, it also demonstrates how to test go through the questions using left/right keys as well as test arrows with 1,2,3,4 keys.这是相当多的代码,因为除了展示如何解析和呈现问题/选择之外,它还演示了如何使用左/右键以及带有 1,2,3,4 的测试箭头来测试通过问题键。 Hopefully the comments illustrate the functionality.希望评论说明了功能。

The decision to store the user selected choice index is optional, more of an idea.存储用户选择的选择索引的决定是可选的,更多的是一种想法。 It might be useful to store quiz results later (which saveJSONArray() can help with).稍后存储测验结果可能很有用( saveJSONArray()可以提供帮助)。

Another option might be to store the data as a CSV table which Processing can easily parse using loadTable() .另一种选择可能是将数据存储为 CSV 表,Processing 可以使用loadTable()轻松解析该表。

Personally I find the JSON format more flexible, even though it's more verbose: you can use a tree structure / questions with different number of options, etc. where as the CSV table is limited to being a table.我个人认为 JSON 格式更灵活,即使它更冗长:您可以使用树结构/具有不同选项数量的问题等,而 CSV 表仅限于一个表。

Last remark when loading/saving strings: pay attention to special characters.加载/保存字符串时的最后一句话:注意特殊字符。

Have fun!玩得开心!

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

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