[英]Java program doesn't add objects to ArrayList
我正在尝试将不同的对象添加到ArrayList
并且不起作用。 我不确定这是因为我添加的对象不正确还是有其他问题。
这是我的代码。
import java.util.*;
import java.io.*;
public class QuizBowl implements Quiz {
private Player player; // player object
private String file; // name of file
private int qNum; // number of questions player wants to answer
private int qNumFile; // number of questions in file
private ArrayList<Question> questionsArr; // holds Question objects
private boolean questionsAsked[]; // array of questions that were already asked
// Constructor
public QuizBowl(String fName, String lName, String file) throws FileNotFoundException {
player = new Player(fName, lName);
Scanner gameFile = new Scanner(new File(file));
qNum = numOfQuestionsToPlay();
qNumFile = maxNumQFile(gameFile);
questionsArr = new ArrayList<Question>();
readFile();
System.out.println(questionsArr);
questionsAsked = new boolean[qNumFile];
System.out.println(Arrays.toString(questionsAsked));
}
// asks user how many questions to ask
public int numOfQuestionsToPlay() {
Scanner console = new Scanner(System.in);
// CHECKS FOR VALID USER INPUT
boolean check = false;
do {
try {
System.out.print("How many questions would you like (out of 3)? ");
int answer = console.nextInt();
if(answer > 3) {
System.out.println("Sorry, that is too many.");
check = false;
}
else {
check = true;
}
}
catch(InputMismatchException e) {
System.out.println("Invalid input. Please try again.");
console.nextLine();
check = false;
}
}
while(check == false);
return qNum;
}
// figures out how many questions are in the file
public int maxNumQFile(Scanner gameFile) {
int num = gameFile.nextInt();
return num;
}
// LOOP FOR READING QUESTIONS
public void readFile() {
for(int i = 0; i < qNum; i++) {
readQuestion();
}
}
// READS QUESTION AFTER QUESTION AND ADDS TO THE ARRAYLIST OF QUESTIONS OBJECTS
public void readQuestion() {
Scanner console = new Scanner(System.in);
console.nextLine();
String[] line;
String question, questionType;
int points;
line = console.nextLine().split(" ");
questionType = line[0];
points = Integer.parseInt(line[1]);
question = console.nextLine();
if(questionType.equals("MC")) { // checks if question type is MC
questionsArr.add(readMC(questionType, question, points, console)); // adds MC question to array
}
else if(questionType.equals("SA")) { // checks if question type is SA
questionsArr.add(readSA(questionType, question, points, console)); // adds SA question to array
}
else { // checks if question type is TF
questionsArr.add(readTF(questionType, question, points, console)); // adds TF question to array
}
}
// READS ONE TF QUESTION
public static QuestionTF readTF(String questionType, String question, int points, Scanner console) { // returns new QuestionTF object
String ans = console.nextLine();
return new QuestionTF(question, questionType, points, ans);
}
// READS ONE SA QUESTION
public static QuestionSA readSA(String questionType, String question, int points, Scanner console) {
String ans = console.nextLine();
return new QuestionSA(question, questionType, points, ans); // returns new QuestionSA object
}
// READS ONE MC QUESTION
public static QuestionMC readMC(String questionType, String question, int points, Scanner console) {
int numChoices;
String[] choices;
String ans;
numChoices = Integer.parseInt(console.nextLine());
choices = new String[numChoices];
ans = console.nextLine();
for(int i = 0; i < numChoices ; i++) {
choices[i] = console.nextLine();
}
return new QuestionMC(question, questionType, points, choices, ans); // returns new QuestionMC object
}
// STARTS QUIZ
public void quiz() {
int qCount = 0;
int ranQ;
Scanner userInput = new Scanner(System.in);
String userAns;
Random r = new Random();
// RUNS QUIZ
while (qCount < qNum) {
ranQ = r.nextInt(qNumFile);
// CHECKS IF QUESTION HAS ALREADY BEEN ASKED
if (!checkDup(ranQ, questionsAsked)) {
questionsAsked[ranQ] = true;
Question question = questionsArr.get(ranQ); // GETS RANDOM QUESTION FROM ARRAY
question.printQuestion(); // prints question and points
userAns = userInput.next(); // retrieves answer from user
// CHECKS USER'S ANSWER
if(userAns.equals("SKIP")) {
System.out.println("You have chosen to skip this question.");
}
else {
checkAnswer(userAns, question, player);
}
qCount++;
System.out.println();
}
}
}
// CHECKS IF QUESTION HAS ALREADY BEEN ASKED
public boolean checkDup(int ranQ, boolean questionsAsked[]){
return questionsAsked[ranQ];
}
// CHECKS ANSWER AND ADDS POINTS
public void checkAnswer(String userAnswer, Question question, Player player) {
if(question.checkAnswer(userAnswer)) {
System.out.println("Correct you get " + question.getPoints());
player.setScore(question.getPoints());
}
else {
System.out.println("Incorrect, the answer was " + question.getAnswer() + "." +
" you lose " + question.getPoints() + ".");
player.setScore(question.getPoints() * -1);
}
}
// Executes program
public static void main(String[] args) throws FileNotFoundException {
Scanner console = new Scanner(System.in);
System.out.print("Please enter your first name: ");
String first = console.next();
System.out.print("Please enter your last name: ");
String last = console.next();
System.out.print("Please enter the game file name: ");
String file = console.next();
QuizBowlRedo newGame = new QuizBowlRedo(first, last, file); // creates new game of QuizBowl
newGame.quiz(); // starts game
}
}
这是我的一个对象类的构造函数。 QuestionMC,QuestionSA和QuestionTF扩展了Question类:
public QuestionSA(String question, String questionType, int points, String answer) {
super(question, questionType, points);
this.answer = answer;
}
这是我正在读取的文本文件:
3
TF 5
There exist birds that can not fly. (true/false)
true
MC 10
Who was the president of the USA in 1991?
6
Richard Nixon
Gerald Ford
Jimmy Carter
Ronald Reagan
George Bush Sr.
Bill Clinton
E
SA 20
What city hosted the 2004 Summer Olympics?
Athens
我正在谈论的部分从readQuestion()
方法开始。 我正在尝试将对象添加到ArrayList
区域中,并带有注释:“读取一个....问题”。 到目前为止,它带有一个空的ArrayList
。
readFile()
一直循环到qnum并调用readQuestion()
。 但是,它不会将“当前”问题编号传递给readQuestion()
。 所以readQuestion()
总是从第一个开始?
readQuestion()
正在打开输入文件(因此,可能会一遍又一遍地读取第一个问题)。 这可能是readFile()
的任务
该方法的第一行从stdin读取。 您可能想从gameFile扫描仪中读取内容?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.