Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
CS 46B: Introduction to Data Structures June 9 Class Meeting Department of Computer Science San Jose State University Summer 2015 Instructor: Ron Mak www.cs.sjsu.edu/~mak Quiz 6 June 11 Take “Quiz 6 June 11” in Canvas before the start of Thursday’s class. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 2 A Class Hierarchy Puzzle Animal Mammal Lion Piranha Bird Goldfish Parrot Hummingbird Suppose we want to add the category HouseholdPet. Dog Fish Do we make it a superclass? Where does it belong in this class hierarchy? What if we also want to add the category Biter? Java allows a class to inherit from at most one superclass. No “multiple inheritance” Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 3 A Class Hierarchy Puzzle, cont’d Animal Mammal Lion Fish Dog Piranha «interface» HouseholdPet Bird Goldfish Parrot Hummingbird «interface» Biter Make HouseholdPet and Biter Java interfaces. A Java class can implement multiple interfaces. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 4 Clicker Question June 9 #1 Suppose we define Then which of the following is true? a. b. c. d. public interface HouseholdPet { void feed(Food f); } Method feed(Food f) is automatically private in the classes that don’t implement interface HouseholdPet. Method feed(Food f) is automatically public in the classes that do implement interface HouseholdPet. We don’t need to implement method feed(Food f) in the classes that also implement interface Biter. A class cannot implement both interfaces HouseholdPet and Biter. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 5 Java Subclass Animal Mammal Lion Dog Fish Piranha Bird Goldfish Parrot Hummingbird If a class C is a subclass of superclass S, then C “is a” S: Dog is a Mammal Dog is an Animal Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 6 Java Interface Animal Mammal Lion Fish Dog Piranha «interface» HouseholdPet Bird Goldfish Parrot Hummingbird «interface» Biter If a class C implements interface N, then C “is a” N: Dog is a HouseholdPet Dog is a Biter Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 7 Java instanceof Operator If the value of variable x is of type Dog, then the following conditionals are all true: x x x x x instanceof instanceof instanceof instanceof instanceof Computer Science Dept. Summer 2015: June 9 Dog Mammal Animal HouseholdPet Biter CS 46B: Introduction to Data Structures © R. Mak 8 Feed Our Pets public interface HouseholdPet { void feed(Food f); } How we find and feed all our pets that are in array animals? for (int i = 0; i < animals.length; i++) { if ((animals[i] != null) && (animals[i] instanceof HouseholdPet)) { HouseholdPet pet = (HouseholdPet) animals[i]; Food f = new Food(); pet.feed(f); } Computer Science Dept. CS 46B: Introduction to Data Structures 9 } Summer 2015: June 9 © R. Mak Feed Our Pets, cont’d Instead of: HouseholdPet pet = (HouseholdPet) animals[i]; pet.feed(f); you can write: ((HouseholdPet) animals[i]).feed(f); The first way may be easier to write and read! Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 10 Marker Interfaces What if an interface type doesn’t declare anything? Suppose public interface Biter { // nothing! } A marker interface is an empty interface that serves to “tag” the classes that implement it. Use the instanceof operator to see which objects are from a tagged class. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 11 Avoid Biters! Example of how to use a marker interface: Animal animals[]; for (int i = 0; i < animals.length; i++) { if ((animals[i] != null) && (animals[i] instanceof Biter)) { // Code that does something // with animals that are biters. // // The code can’t call any // Biter methods because // there aren’t any. } } Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 12 Java Interface Constants An interface type cannot contain instance variables. Only a class type can have instance variables. If an interface type definition declares any variables, they are automatically made public static final In other words, they’re constants. Any class that implements the interface shares the constants. public interface HouseholdPet { int VET_VISTS = 2; // visits per year to the vet ... } Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 13 Objects and Interfaces If class C implements interface N, then objects of class C can be assigned to variables of the interface type N. public class Dog implements HouseholdPet { ... } HouseholdPet pet = new Dog(...); Interface type Computer Science Dept. Summer 2015: June 9 Implements the HouseholdPet interface CS 46B: Introduction to Data Structures © R. Mak 14 Objects and Interfaces, cont’d The type of an object is never an interface type. The type of a variable can be an interface type. The value of such a variable is a reference to an object whose class implements the interface type. public class Dog implements HouseholdPet { ... } HouseholdPet pet = new Dog(...); Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 15 Break Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 16 Reading and Writing Text Files Most programs need to read input data and write output results. We will look at how to read input data and write results in the form of text files. The Scanner class is the most convenient way to read data from a text file. The PrintWriter class is the most convenient way to write results to a text file. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 17 Create a Scanner Object The constructor for the Scanner class can have a reference to a File object as its argument: File inputFile = new File("myinput.txt"); Scanner in = new Scanner(inputFile); Or: Scanner in = new Scanner(new File("myinput.txt")); The Scanner class lives in the java.util package, so you must import it: import java.util.Scanner; Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 18 Create a PrintWriter Object The constructor for the PrintWriter class can have either a reference to a File object as its argument, or just the name of the output file: PrintWriter out = new PrintWriter("myoutput.txt"); The PrintWriter class lives in the java.io package, so you must import it: import java.io.PrintWriter; Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 19 Create a PrintWriter Object, cont’d What happens if the output file already exists? The file is completely overwritten with new contents. What happens if the output file doesn’t already exist? A new output file is automatically created. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 20 Close the Input and Output Files When your program is done with an input or an output file, it should close it: in.close(); out.close(); // close the Scanner input file // close the PrintWriter output file If you don’t close an output file, the last part of your output may not make it into the file. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 21 Clicker Question June 9 #2 Consider the statement Scanner in = new Scanner("myinput.txt"); a. b. c. d. This is a runtime error because the Scanner constructor expects a reference to a file object. This is a compile-time error because the Scanner constructor expects a reference to a file object. This is acceptable because your program will read from an input file named myinput.txt. This is acceptable because your program will read from the string "myinput.txt". Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 22 Read Words The Scanner class’s hasNext() method returns true if there is a word to read next from the input; otherwise, it returns false. The Scanner class’s next() method reads the next word from the input and returns it as a string. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 23 Read Words, cont’d How do you read one word after another from an input text file? Suppose variable in is a reference to a Scanner object: while (in.hasNext()) { String word = in.next(); System.out.println(word); } How does this loop work? Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 24 Read Words, cont’d while (in.hasNext()) { String word = in.next(); System.out.println(word); } If the input file contains Mary had a little lamb What is the output? Mary had a little lamb Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 25 Read Words, cont’d Java considers a word to be any consecutive sequence of characters that is not “white space”. White space includes any spaces, tabs, and newline characters. So if the input file contains instead Mary had 12 little #%@&!! lambs. the output will be Computer Science Dept. Summer 2015: June 9 Mary had 12 little #%@&!! lambs. Why? CS 46B: Introduction to Data Structures © R. Mak 26 Read Words, cont’d You can tell your Scanner object to only read words and discard anything else. Tell it that any character that is not a letter (upper and lower case) is a “delimiter”. A delimiter is a character that separates one word from another. What are word delimiters by default? spaces, tabs, and newline characters in.useDelimiter("[^A-Za-z]+"); A “regular expression” that says “one or more characters that is not a letter”. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 27 Read Characters If you want to read a text file one character at a time, set the delimiter to an empty string: in.useDelimiter(""); Then in.next() will read the next character, but it will still return it as a string. How to get the character out of the string? while (in.hasNext()) { char ch = in.next().charAt(0); /* do something with ch */ } Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 28 Classify Characters Each of the following boolean methods takes a character as an argument. Typo: It should be isWhitespace (lower-case s). Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 29 Read Lines The Scanner class’s hasNextLine() method returns true if there is a line to read next from the input; otherwise, it returns false. The Scanner class’s nextLine() method reads the next line from the input and returns it as a string. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 30 Read Lines, cont’d How do you read one line after another from an input text file? Suppose variable in is a reference to a Scanner object: while (in.hasNextLine()) { String line = in.nextLine(); System.out.println(line); } How does this loop work? Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 31 Read Numbers The Scanner class has methods to read numbers, including: hasNextInt() and nextInt() hasNextLong() and nextLong() hasNextDouble() and nextDouble() Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 32 Read Numbers, cont’d Note that if a number is the last item in an input line, methods nextInt(), nextLong(), and nextDouble() will not read the following newline character. Therefore, a subsequent call to nextLine() will read an empty string. So you will need yet another call to nextLine() to read the next input line. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 33 Handle I/O Errors Examples of runtime I/O errors: Attempt to read a file that doesn’t exist. Attempt to read a number from an input text file but there isn’t a number. At run time, Java will detect I/O errors. It is your program’s responsibility to handle the errors. What should your program do when an I/O error occurs? Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 34 Introduction to Exception Handling Java exception handling is a flexible means of transferring runtime control: From the point an exception (error) is detected To special code to handle (deal with) the error. try { /* code that can cause an exception, such as an attempt to read a nonexistent file. */ } catch (FileNotFoundException ex) { /* code to handle the exception, such as writing an error message. */ } Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 35 Introduction to Exception Handling, cont’d try { ... } The exception variable ex catch (SomeException ex) { contains useful information about the exception that just occurred. ... } When a statement inside a try block causes an exception, your program immediately branches to the catch block. After executing the catch block, your program continues to the next statement. It does not resume executing the try block. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 36 FileNotFoundException Handler Example public int countLines() { int count = 0; Scanner in = null; try { in = new Scanner(inputFile); while (in.hasNextLine()) { in.nextLine(); ++count; } } catch (FileNotFoundException ex) { ex.printStackTrace(); } return count; Computer Science Dept. Summer 2015: June 9 } CS 46B: Introduction to Data Structures © R. Mak 37 The finally Clause Add a finally block to a try-catch statement for code that should be executed after the try block, whether or not an exception occurred. try { in = new Scanner(inputFile); ... } catch (FileNotFoundException ex) { ex.printStackTrace(); } Why do we need to check finally { if (in != null) in.close(); whether in is null? } No matter whether the try block executed normally, or an exception occurred and the catch block executed, Computer Science Dept. CS 46B: Introduction to Data Structures Summer 2015:always June 9 © R. Mak we will close the input file. 38 Homework #2 Write a Java program that will read Lincoln’s Gettysburg Address from a text file. Count and print how many lines, words, and characters are in the text file. Just use the default word delimiters. Calculate and print what percentage of the file’s characters are digits lower-case letters upper-case letters Computer Science Dept. Summer 2015: June 9 white-space characters other characters CS 46B: Introduction to Data Structures © R. Mak 39 Homework #2, cont’d Draft: Due Wednesday, June 10 at 11:59 PM Just count and print the number of lines, words, and characters. Canvas: URL: Homework 2 Draft http://codecheck.it/codecheck/files/1506091032cjhe 4tuyws7nwgo420hi8tkw8 Final: Due Friday, June 12 at 11:59 PM Also calculate and print the percentages. Canvas: URL: Homework 2 Final http://codecheck.it/codecheck/files/1506091036ay0z b7ctd13x92r8zy4xs7h7y Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 40 Homework #2, cont’d Input file GettysburgAddress.txt: http://www.cs.sjsu.edu/~mak/CS46B/assignmen ts/2/GettysburgAddress.txt Your solution must Use the Scanner class for the input file. Always close an open input file. Catch and handle runtime I/O errors. For this assignment, to count lines, words, and characters, it’s probably easiest to open, read, and close the input file three times. Computer Science Dept. Summer 2015: June 9 CS 46B: Introduction to Data Structures © R. Mak 41