【问题标题】:I want to make a 2D array with processing我想制作一个带有处理的二维数组
【发布时间】:2021-07-19 15:22:11
【问题描述】:

我正在尝试通过从 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

培训.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();
}

我想做一个二维数组..

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

【问题讨论】:

  • 您到底遇到了哪一部分?请阅读How to Ask

标签: java processing


【解决方案1】:

您可以使用来加载和读取行。将每一行存储在一个 Arraylist 中:

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

现在,对于 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]);
 }

【讨论】:

    【解决方案2】:

    你可以这样使用:

    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(","));
    }
    

    如您所见,问题是字符串数组的列表。 该列表的每个元素都对应于文件的一行,您可以使用 questions.get(index) 访问一行。 您还可以使用标准数组表示法获取行的特定元素

    例如使用您提供的示例,questions.get(1)[2] 将返回 choicesB-1

    请记住,从纯文本 (.txt) 中读取数据总是会让您头疼。您应该使用 JSON 或 YAML 之类的格式来存储您的数据,这些格式已经有了一个好的解析器。

    【讨论】:

      【解决方案3】:

      Alberto 和 devReddit 建议的字符串解析选项很好 (+1)。

      我想建议将数据重组为a JSON array

      [
          {
            "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
          }
        ]
      

      如果你将它保存在一个新的草图文件夹中questionnaire.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);
      }
      

      这是相当多的代码,因为除了展示如何解析和呈现问题/选项之外,它还演示了如何使用左/右键测试问题以及使用 1,2 的测试箭头, 3,4 键。希望 cmets 说明了功能。

      存储用户选择索引的决定是可选的,更多的是一个想法。稍后存储测验结果可能很有用(saveJSONArray() 可以提供帮助)。

      另一种选择可能是将数据存储为 CSV 表,Processing 可以使用 loadTable() 轻松解析该表。

      我个人认为 JSON 格式更灵活,尽管它更冗长:您可以使用具有不同数量选项的树结构/问题等,因为 CSV 表格仅限于表格。

      加载/保存字符串时的最后一句话:注意特殊字符。

      玩得开心!

      【讨论】:

      • 谢谢你给我一个礼貌的解释。不幸的是,我必须使用一个.txt文件。因为这是学校老师给我的作业。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多