Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Complete exercise 14.47 on page 552 Submit the Responder.java file Responder.java file: import java.io.*; import java.nio.charset.Charset; import java.nio.file.*; import java.util.*; /** * The responder class

Complete exercise 14.47 on page 552 Submit the Responder.java file

image text in transcribed

Responder.java file:

import java.io.*; import java.nio.charset.Charset; import java.nio.file.*; import java.util.*;

/** * The responder class represents a response generator object. * It is used to generate an automatic response, based on specified input. * Input is presented to the responder as a set of words, and based on those * words the responder will generate a String that represents the response. * * Internally, the reponder uses a HashMap to associate words with response * strings and a list of default responses. If any of the input words is found * in the HashMap, the corresponding response is returned. If none of the input * words is recognized, one of the default responses is randomly chosen. * * @author David J. Barnes and Michael Klling. * @version 2016.02.29 */ public class Responder { // Used to map key words to responses. private HashMap responseMap; // Default responses to use if we don't recognise a word. private ArrayList defaultResponses; // The name of the file containing the default responses. private static final String FILE_OF_DEFAULT_RESPONSES = "default.txt"; private Random randomGenerator;

/** * Construct a Responder */ public Responder() { responseMap = new HashMap(); defaultResponses = new ArrayList(); fillResponseMap(); fillDefaultResponses(); randomGenerator = new Random(); }

/** * Generate a response from a given set of input words. * * @param words A set of words entered by the user * @return A string that should be displayed as the response */ public String generateResponse(HashSet words) { Iterator it = words.iterator(); while(it.hasNext()) { String word = it.next(); String response = responseMap.get(word); if(response != null) { return response; } } // If we get here, none of the words from the input line was recognized. // In this case we pick one of our default responses (what we say when // we cannot think of anything else to say...) return pickDefaultResponse(); }

/** * Enter all the known keywords and their associated responses * into our response map. */ private void fillResponseMap() { responseMap.put("crash", "Well, it never crashes on our system. It must have something " + "to do with your system. Tell me more about your configuration."); responseMap.put("crashes", "Well, it never crashes on our system. It must have something " + "to do with your system. Tell me more about your configuration."); responseMap.put("slow", "I think this has to do with your hardware. Upgrading your processor " + "should solve all performance problems. Have you got a problem with " + "our software?"); responseMap.put("performance", "Performance was quite adequate in all our tests. Are you running " + "any other processes in the background?"); responseMap.put("bug", "Well, you know, all software has some bugs. But our software engineers " + "are working very hard to fix them. Can you describe the problem a bit " + "further?"); responseMap.put("buggy", "Well, you know, all software has some bugs. But our software engineers " + "are working very hard to fix them. Can you describe the problem a bit " + "further?"); responseMap.put("windows", "This is a known bug to do with the Windows operating system. Please " + "report it to Microsoft. There is nothing we can do about this."); responseMap.put("macintosh", "This is a known bug to do with the Mac operating system. Please " + "report it to Apple. There is nothing we can do about this."); responseMap.put("expensive", "The cost of our product is quite competitive. Have you looked around " + "and really compared our features?"); responseMap.put("installation", "The installation is really quite straight forward. We have tons of " + "wizards that do all the work for you. Have you read the installation " + "instructions?"); responseMap.put("memory", "If you read the system requirements carefully, you will see that the " + "specified memory requirements are 1.5 giga byte. You really should " + "upgrade your memory. Anything else you want to know?"); responseMap.put("linux", "We take Linux support very seriously. But there are some problems. " + "Most have to do with incompatible glibc versions. Can you be a bit " + "more precise?"); responseMap.put("bluej", "Ahhh, BlueJ, yes. We tried to buy out those guys long ago, but " + "they simply won't sell... Stubborn people they are. Nothing we can " + "do about it, I'm afraid."); }

/** * Build up a list of default responses from which we can pick * if we don't know what else to say. */ private void fillDefaultResponses() { Charset charset = Charset.forName("US-ASCII"); Path path = Paths.get(FILE_OF_DEFAULT_RESPONSES); try (BufferedReader reader = Files.newBufferedReader(path, charset)) { String response = reader.readLine(); while(response != null) { defaultResponses.add(response); response = reader.readLine(); } } catch(FileNotFoundException e) { System.err.println("Unable to open " + FILE_OF_DEFAULT_RESPONSES); } catch(IOException e) { System.err.println("A problem was encountered reading " + FILE_OF_DEFAULT_RESPONSES); } // Make sure we have at least one response. if(defaultResponses.size() == 0) { defaultResponses.add("Could you elaborate on that?"); } }

/** * Randomly select and return one of the default responses. * @return A random default response */ private String pickDefaultResponse() { // Pick a random number for the index in the default response list. // The number will be between 0 (inclusive) and the size of the list (exclusive). int index = randomGenerator.nextInt(defaultResponses.size()); return defaultResponses.get(index); } }

52 Chapter 14 Handling Errors Responses method. Using any text editor, change it contains an empty line between anyt work correctly again in reading in the responses from this file. Exercise 14.45 The file default.txt in the project folder of the t support-io project contains the default responses read in by the fi11D code 14.2 oursoth Reading inte ger data wit the content of this file so that scann Exercise 14.46 Change your code so that several lines of text found in th file not separated by an empty line are read as one single response. Change the default.txt file so that it contains some responses spanning multiple lines. Test. Exercise 14.47 Modify the Responder class of the tech-support-io project so that it reads the associations between keywords and responses from a text file, rather than initializing responseMap with strings written into the source code in the fil1ResponseMap method. You can use the fil1DefaultResponses method as a pattern, but you will need to make some changes to its logic, because there are two strings to be read for each entry rather than one-the keyword and the response. Try storing keywords and responses on alternating lines; keep the text of each response on a single line. You may assume that there will always be an even number of lines (i.e., no missing responses)

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Practical Neo4j

Authors: Gregory Jordan

1st Edition

1484200225, 9781484200223

More Books

Students also viewed these Databases questions