This repository has been archived on 2026-05-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
CSE-123/c3/QuizTree.java
2026-05-20 16:20:45 -07:00

171 lines
6.0 KiB
Java

import java.util.*;
import java.io.*;
public class QuizTree {
private QuizTreeNode head;
// PROVIDED
// Returns the given percent rounded to two decimal places.
private double roundTwoPlaces(double percent) {
return (double) Math.round(percent * 100) / 100;
}
public int size() {
return size(head);
}
private int size(QuizTreeNode root) {
if (root == null) {
return 0;
}
return 1 + size(root.left) + size(root.right);
}
public QuizTree(Scanner inputFile) {
this.head = null;
this.head = populateTree(inputFile, head);
}
private void printTree(QuizTreeNode root) {
if (root != null) {
System.out.println(root.data);
printTree(root.left);
printTree(root.right);
}
}
private QuizTreeNode populateTree(Scanner inputFile, QuizTreeNode root) {
if (inputFile.hasNextLine()) {
String next = inputFile.nextLine();
String data;
int score;
// we've reached a result, make a node but dont recurse
if (next.startsWith("END:")) {
data = next.substring(4, next.lastIndexOf("-"));
score = Integer.parseInt(next.substring(next.lastIndexOf("-") + 1));
return new QuizTreeNode(data, score);
}
// otherwise, we're not at the end yet, make a node and keep going
else {
data = next.substring(0, next.lastIndexOf("-"));
score = Integer.parseInt(next.substring(next.lastIndexOf("-") + 1));
root = new QuizTreeNode(data, score);
root.left = populateTree(inputFile, root.left);
root.right = populateTree(inputFile, root.right);
}
}
return root;
}
public void takeQuiz(Scanner console) {
takeQuiz(console, head);
}
private void takeQuiz(Scanner console, QuizTreeNode root) {
if (root.left != null && root.right != null) {
String left = root.data.substring(0, root.data.lastIndexOf("/"));
String right = root.data.substring(root.data.lastIndexOf("/")+1, root.data.length());
System.out.print("Do you prefer " + left + " or " + right + "? ");
String input = console.nextLine();
while (!input.equalsIgnoreCase(left) || !input.equalsIgnoreCase(right)) {
System.out.println(" Invalid response; try again.");
System.out.print("Do you prefer " + left + " or " + right + "? ");
input = console.nextLine();
}
takeQuiz(console, input.equalsIgnoreCase(left) ? root.left : root.right);
}
else {
System.out.println("Your result is: " + root.data);
System.out.println("Your score is: " + root.score);
}
}
public void export(PrintStream outputFile) {
export(outputFile, this.head);
}
private void export(PrintStream outputFile, QuizTreeNode root) {
if (root.left == null && root.right == null) {
outputFile.println("END:" + root.data + "-" + root.score);
} else {
outputFile.println(root.data + "-" + root.score);
}
if (root.left != null) {
export(outputFile, root.left);
}
if (root.right != null) {
export(outputFile, root.right);
}
}
//public void addQuestion(String toReplace, String choices, String leftResult, String rightResult) {
//}
public void addQuestion(String toReplace, String choices, String leftResult, String rightResult) {
head = addQuestion(head, toReplace.toLowerCase(), choices, leftResult, rightResult);
}
private QuizTreeNode addQuestion(QuizTreeNode root, String toReplace, String choices, String leftResult, String rightResult) {
if (root == null) {
return null;
}
if (root.left == null && root.right == null && root.data.equalsIgnoreCase(toReplace)) {
// Parse choices to get left choice, right choice, and score
String choiceText = choices.substring(0, choices.lastIndexOf("-"));
int choiceScore = Integer.parseInt(choices.substring(choices.lastIndexOf("-") + 1));
// Create the new choice node
QuizTreeNode choiceNode = new QuizTreeNode(choiceText, choiceScore);
// Parse leftResult to get left result data and score
String leftData = leftResult.substring(0, leftResult.lastIndexOf("-"));
int leftScore = Integer.parseInt(leftResult.substring(leftResult.lastIndexOf("-") + 1));
QuizTreeNode leftNode = new QuizTreeNode(leftData, leftScore);
// Parse rightResult to get right result data and score
String rightData = rightResult.substring(0, rightResult.lastIndexOf("-"));
int rightScore = Integer.parseInt(rightResult.substring(rightResult.lastIndexOf("-") + 1));
QuizTreeNode rightNode = new QuizTreeNode(rightData, rightScore);
// Set the left and right children of the new choice node
choiceNode.left = leftNode;
choiceNode.right = rightNode;
return choiceNode;
} else {
root.left = addQuestion(root.left, toReplace, choices, leftResult, rightResult);
root.right = addQuestion(root.right, toReplace, choices, leftResult, rightResult);
return root;
}
}
public static class QuizTreeNode {
public final String data;
public final int score;
public QuizTreeNode left;
public QuizTreeNode right;
public QuizTreeNode(String data, int score) {
this(data, score, null, null);
}
public QuizTreeNode(String data, int score, QuizTreeNode left, QuizTreeNode right) {
this.data = data;
this.score = score;
this.left = left;
this.right = right;
}
}
}