Magpie Activity 3
<< Magpie Activity 2 | MagpieLab | Magpie Activity 4 >>
Video explaining the new findKeyword method that fixes the bug in searching for strings in the user's statement.
Magpie3.java
/** * A program to carry on conversations with a human user. * This version: * <ul><li> * Uses advanced search for keywords * </li></ul> * * @author Laurie White * @version April 2012 */ public class Magpie3 { /** * Get a default greeting * * @return a greeting */ public String getGreeting() { return "Hello, let's talk."; } /** * Gives a response to a user statement * * @param statement * the user statement * @return a response based on the rules given */ public String getResponse(String statement) { String response = ""; if (statement.length() == 0) { response = "Say something, please."; } else if (findKeyword(statement, "no") >= 0) { response = "Why so negative?"; } else if (findKeyword(statement, "mother") >= 0 || findKeyword(statement, "father") >= 0 || findKeyword(statement, "sister") >= 0 || findKeyword(statement, "brother") >= 0) { response = "Tell me more about your family."; } else { response = getRandomResponse(); } return response; } /** * Search for one word in phrase. The search is not case * sensitive. This method will check that the given goal * is not a substring of a longer string (so, for * example, "I know" does not contain "no"). * * @param statement * the string to search * @param goal * the string to search for * @param startPos * the character of the string to begin the * search at * @return the index of the first occurrence of goal in * statement or -1 if it's not found */ private int findKeyword(String statement, String goal, int startPos) { String phrase = statement.trim(); // The only change to incorporate the startPos is in // the line below int psn = phrase.toLowerCase().indexOf( goal.toLowerCase(), startPos); // at this point, if psn found the goal string inside // the statement, it is psn is 0 or greater // Refinement--no to make sure that the goal isn't part of a // word, like "no" inside "knowledge" while (psn >= 0) { // Find the string of length 1 before and after // the word- we want to grap the the letter before and // after the found string. String before = " ", after = " "; if (psn > 0) { before = phrase.substring(psn - 1, psn) .toLowerCase(); } if (psn + goal.length() < phrase.length()) { after = phrase.substring( psn + goal.length(), psn + goal.length() + 1) .toLowerCase(); } // If before and after aren't letters, we've // found the word if (((before.compareTo("a") < 0) || (before .compareTo("z") > 0)) // before is not a // letter && ((after.compareTo("a") < 0) || (after .compareTo("z") > 0))) { return psn; } // We only get to this part of the code if // the last position didn't work, so let's find // the next, if there is one. psn = phrase.indexOf(goal.toLowerCase(), psn + 1); } return -1; } /** * Search for one word in phrase. The search is not case * sensitive. This method will check that the given goal * is not a substring of a longer string (so, for * example, "I know" does not contain "no"). The search * begins at the beginning of the string. * * @param statement * the string to search * @param goal * the string to search for * @return the index of the first occurrence of goal in * statement or -1 if it's not found */ private int findKeyword(String statement, String goal) { return findKeyword(statement, goal, 0); } /** * Pick a default response to use if nothing else fits. * * @return a non-committal string */ private String getRandomResponse() { final int NUMBER_OF_RESPONSES = 4; double r = Math.random(); int whichResponse = (int) (r * NUMBER_OF_RESPONSES); String response = ""; if (whichResponse == 0) { response = "Interesting, tell me more."; } else if (whichResponse == 1) { response = "Hmmm."; } else if (whichResponse == 2) { response = "Do you really think so?"; } else if (whichResponse == 3) { response = "You don't say."; } return response; } }
MagpieRunner3.java
import java.util.Scanner; /** * A simple class to run the Magpie class. * @author Laurie White * @version April 2012 */ public class MagpieRunner3 { /** * Create a Magpie, give it user input, and print its replies. */ public static void main(String[] args) { Magpie3 maggie = new Magpie3(); System.out.println (maggie.getGreeting()); Scanner in = new Scanner (System.in); String statement = in.nextLine(); while (!statement.equals("Bye")) { System.out.println (maggie.getResponse(statement)); statement = in.nextLine(); } } }
StringExplorer.java
/** * A program to allow students to try out different * String methods. * @author Laurie White * @version April 2012 */ public class StringExplorer { public static void main(String[] args) { String sample = "The quick brown fox jumped over the lazy dog."; // Demonstrate the indexOf method. int position = sample.indexOf("quick"); System.out.println ("sample.indexOf(\"quick\") = " + position); // Demonstrate the toLowerCase method. String lowerCase = sample.toLowerCase(); System.out.println ("sample.toLowerCase() = " + lowerCase); System.out.println ("After toLowerCase(), sample = " + sample); // Try other methods here: } }