public static void main(String[] args) { // GUI Variables int width = 1024; int height = 256; int pauseTime = 0; Font typeFont = new Font("Consolas", 1, 24); Font sentenceFont = new Font("Consolas", 0, 16); boolean multipleWords = false; // Strings for typing word, prediction, and sentence. StringBuilder typeString = new StringBuilder(); String prediction; StringBuilder sentence = new StringBuilder(); // Set up window StdDraw.setCanvasSize(width, height); StdDraw.setXscale(0.0, (double) width); StdDraw.setYscale(0.0, (double) height); // Train on files. WordPredictor predictor; if (args.length > 0) { try { int number = Integer.parseInt(args[args.length - 1]); if (number > 0 && number <= 9) { predictor = new WordPredictor(number); multipleWords = true; } else { predictor = new WordPredictor(); } } catch (NumberFormatException e) { predictor = new WordPredictor(); predictor.train(args[args.length - 1]); } for (int i = 0; i < args.length - 1; i++) { predictor.train(args[i]); } predictor.build(); } else { predictor = new WordPredictor(); } // Main loop for GUI and typing. while (true) { // Clear screen and reset variables. StdDraw.clear(); ArrayList<Word> best = null; if (predictor.getBest(typeString.toString()) != null) { best = predictor.getBest(typeString.toString()).getList(); } // If next key has been typed then act. if (StdDraw.hasNextKeyTyped()) { char key = StdDraw.nextKeyTyped(); // If key is a-z or apostrophe add it to string. if ((key >= 'a' && key <= 'z') || key == '\'') { typeString.append(key); } else if (key == ' ') { // If space move word to sentence, train into dict and reset if (typeString.length() > 0) { sentence.append(typeString + " "); predictor.trainWord(typeString.toString()); predictor.build(); typeString = null; typeString = new StringBuilder(); } } else if (key == '\b') { // Remove last letter if possible. if (typeString.length() > 0) { typeString.deleteCharAt(typeString.length() - 1); } } else if (key == '\n') { if (best != null) { // If enter was pressed and there is a prediction // Use the prediction and reset current word. sentence.append(best.get(0).getWord() + " "); typeString = null; typeString = new StringBuilder(); predictor.trainWord(best.get(0).getWord()); predictor.build(); } } else if (multipleWords) { // If there are multiple words available listen for numbers // These will allow for adding from suggestions. if (key >= '1' && key <= '9' && best != null) { int predNum = Integer.parseInt(key + ""); if (best.size() >= predNum) { sentence.append(best.get(predNum - 1).getWord() + " "); typeString = null; typeString = new StringBuilder(); predictor.trainWord(best.get(predNum - 1).getWord()); predictor.build(); } } } } // Start redrawing onto screen. // Typed word set up and print. StdDraw.setPenColor(Color.BLACK); StdDraw.setFont(typeFont); StdDraw.text(width / 2, height / 4 * 3, typeString.toString()); // Show prediction if it exists. if (best != null) { StdDraw.setPenColor(Color.BLUE); for (int i = 0; i < best.size(); i++) { StdDraw.text( width * ((i + .5) / best.size()), height / 2 + typeFont.getSize() / 2, best.get(i).getWord()); if (multipleWords) { StdDraw.text( width * ((i + .5) / best.size()), height / 2 - typeFont.getSize() / 2, "" + (i + 1)); } } StdDraw.setPenColor(Color.BLACK); } // Print out the sentence. StdDraw.setFont(sentenceFont); StdDraw.textRight(width - 20, height / 4, sentence.toString()); // Pause the loop based on time set at beginning. Set to 0. StdDraw.show(pauseTime); } }