1

我有一个文件要存储到 ArrayList 中,但我不知道如何格式化它,以便将某些文本字符串存储在特定的索引中。第一行是类别,第二行是问题,第三行是琐事问题的答案。我需要这样做,以便我可以随机选择问题,然后检查问答游戏的答案。到目前为止,我得到的只是每个单词都用逗号分隔。从教授那里,

"输入文件包含不同类别的问题和答案。对于每个类别,第一行表示类别的名称。这一行后面将有若干对行。对的第一行是问题,并且第二行是其对应的答案。一个空行分隔类别。

到目前为止,这是我的代码:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;



public class TriviaGamePlayer {

/**
 * @param args
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    ArrayList<String> triviaQuestion = new ArrayList<String>();

    Scanner infile = new Scanner(new File("trivia.txt"));



    while(infile.hasNext()){

        triviaQuestion.add(infile.next());
}


    System.out.println(triviaQuestion);
}


}
4

2 回答 2

1

从到目前为止我在问题中看到的情况来看,您最好创建自己的TriviaQuestion对象,它看起来像

public class TriviaQuestion
{ 
     public String question;
     public String answer;
     public boolean asked;
     public String category;

     TriviaQuestion (String q, String a, String c)
     {
         question = q;
         answer = a;
         category = c;
     }
 }

然后你有几个选择,但如果你有这个对象,那么一切都会变得容易一些。我会创建一个Map<String,List<TriviaQuestion>>关键是你的类别的地方。

然后在读取文件时,您还应该使用infile.hasNextLine()inFile.nextLine()

  1. 读一行(首先我假设是类别)
  2. 阅读接下来的两行(问答)
    • 创建新实例`new TriviaQuestion(问题,答案,类别)'
    • 将此添加到数组列表
    • 重复直到空白
  3. 如果下一行为空白,则将列表添加到地图并循环回 (1)

喜欢:(这是假设格式良好的文件)

String line = inFile.nextLine();  //first line
String category = line;
while(infile.hasNextLine())
{
    line = inFile.nextLine();
    if(line.isEmpty()) //blank line
         category = inFile.nextLine();
    else
    {
         String q = line;
         String a = inFile.nextLine();
         //do other stuff
    }
}  

然后要问一个问题,获取该类别的列表,选择一个随机问题,然后将其设置为已询问,这样它就不会再次出现

ArrayList<TriviaQuestion> questions = yourMap.get("Science");
Integer aRandomNumber = 23 //(create a random Number using list size)
TriviaQuestion questionToAsk = questions.get(aRandomNumber)
System.out.println(questionToAsk.question)
questionToAsk.asked = true
于 2013-09-20T03:21:12.083 回答
0

我会通过确定需要什么来解决这个问题。您有一个类别列表(字符串)。在每个类别中,都会有一个问题(字符串)和答案(字符串)对的列表。从那里我们已经看到了一些组织数据的“逻辑”方式。

  • 问题 - 字符串
  • 答案 - 字符串
  • 问题/答案对 - 编写一个类(现在,我们将其称为 QAPair),其中包含两个字符串作为字段(一个用于问题,一个用于答案)
  • 一个类别中的 Q/A 对列表 - ArrayList
  • 类别列表,映射到 Q/A 对列表 - 也许地图可以解决问题。类型为:地图>

从那里开始解析文件;对于第一行,或者遇到空行后,您知道 String 将给出一个类别名称。您可以调用 containsKey() 来检查类别名称是否已经存在;如果它确实为该类别获取 Q/A Pairs 的 ArrayList 并继续添加到列表中,否则初始化一个新的 ArrayList 并将其添加到该类别的映射中。

然后,您可以阅读一对线。对于您读取的每一对行,初始化一个 QAPair 对象,然后将其添加到它们所属类别的 ArrayList 中。

下面是一个使用 Map 的例子:

Map<String, ArrayList<QAPair>> categories = new HashMap<String, ArrayList<QAPair>>();
if (!categories.containsKey("Math")) { // Check to see if a Math category exists
    categories.put("Math", new ArrayList<QAPair>()); // If it doesn't, create it
}
QAPair question1 = new QAPair("2+2", "4");
// get() method returns the ArrayList for the "Math" category
// add() method adds the QAPair to the ArrayList for the "Math" category
categories.get("Math").add(question1);

要从地图中获取类别列表并选择一个:

// Convert to an array of Strings
String[] catArray = categories.toArray(new String[0]);
// Get the 10th category in the array
// Use catArray.length to find how many categories there are total
catArray[10];
于 2013-09-20T03:27:44.177 回答