COMP 401 ITERATOR DESIGN PATTERN Instructor Prasun Dewan OBJECT BASED SCANNING Redo the scanning solution Monolithic single class solution does UI and scanning No reuse of code Another scanning problem to show reuse Illustrate streams and iterator design pattern 2 UPPER CASE PRINTING 3 UPPER CASE PRINTING package warmup public class AnUpperCasePrinter public static void main String args assume user enters arguments correctly System out println Upper Case Letters int index 0 while index args 0 length if Character isUpperCase args 0 charAt index System out print args 0 charAt index index System out println 4 PRINTING SCANNED CHARACTERS FORWARDS AND BACKWARDS Solution cannot scan multiple times 5 SOLUTION package warmup public class AReverseUpperCasePrinter static final int MAX CHARS 5 static char upperCaseLetters new char MAX CHARS static int numberOfUpperCaseLetters 0 public static void main String args int index 0 System out println Upper Case Letters while index args 0 length if isUpperCase args 0 charAt index System out print args 0 charAt index storeChar args 0 charAt index index System out println printReverse 6 SOLUTION CONTD public static void storeChar char c if numberOfUpperCaseLetters MAX CHARS System out println Too many upper case letters Terminating program System exit 1 upperCaseLetters numberOfUpperCaseLetters c numberOfUpperCaseLetters public static void printReverse System out println Upper Case Letters in Reverse for int index numberOfUpperCaseLetters 1 index 0 index System out print upperCaseLetters index System out println 7 TWO SCANNING PROBLEMS One UI is a subset of the other What about the code 8 NO REUSE AND UI SEPERATION IN MONOLITHIC SOLUTIONS int index 0 System out println Upper Case Letters token processing while index args 0 length if Character isUpperCase args 0 charAt index System out print args 0 charAt index token processing index UI and scanning mixed together int index 0 System out println Upper Case Letters token processing while index args 0 length Only difference if Character isUpperCase args 0 charAt index System out print args 0 charAt index token processing storeChar args 0 charAt index How to put it in separate class index that only scans and does not store or print 9 DIVISION OF LABOR IN CHARACTER SCANNING Scanner class that produces tokens Main class that processes tokens prints and or stores tokens 10 INDEX BASED INTERFACE AnIndexedBasedScanner Main class that processes tokens prints and or stores tokens 11 INDEX BASED INTERFACE public interface IndexBasedScanner public String getTokenArray public int getNumberOfTokens 12 IMPLEMENTATION WITH ARRAY PROPERTY public class AnIndexBasedScanner implements IndexBasedScanner static final int MAX CHARS 5 String upperCaseLetters int numberOfUpperCaseLetters public AnIndexBasedScanner String theScannedString scan theScannerString void scan String theScannedString store all scanned tokens in upperCaseLetters public String getTokenArray return upperCaseLetters public int getNumberOfTokens return numberOfUpperCaseLetters All tokens scanned and stored even if only some may be used by code processing the tokens 13 BETTER SCANNING INTERFACE Scanner class that produces tokens Analogy with Division of Labor in Radio Station Scanning Main class that processes tokens prints and or stores tokens 14 DIVISION OF LABOR IN RADIO SCANNING 15 DIVISION OF LABOR IN RADIO SCANNING 16 DIVISION OF LABOR IN RADIO SCANNING 17 DIVISION OF LABOR IN RADIO SCANNING 18 DIVISION OF LABOR IN RADIO SCANNING 19 DIVISION OF LABOR IN RADIO SCANNING 20 DIVISION OF LABOR IN RADIO SCANNING 21 DIVISION OF LABOR IN RADIO SCANNING 22 DIVISION OF LABOR IN RADIO SCANNING 23 ANALOGOUS DIVISION OF LABOR Scanner class that produces tokens Main class that processes tokens prints and or stores tokens 24 DIVISION OF LABOR IN CHARACTER SCANNING Scanner class that produces tokens Instance of Scanner object Intantiates Uses Invokes methods in Main class that processes tokens prints and or stores tokens Java input libraries illustrate this division of labor in scanning 25 USING JAVA SCANNING LIBRARIES BufferedReader dataIn new BufferedReader new InputStreamReader System in int product 1 add input list terminated by a negative number while true int num Integer parseInt dataIn readLine if num 0 break product product num System out println product Parameter to InputStreamReader Parameter to BufferedReader Give next line in sequence of input lines 26 CONSTRUCTOR PARAMETERS InputStreamReader takes System in as parameter BufferedReader takes InputStreamReader as parameter In general scanner takes object producing scanned stream as parameter 27 DIVISION OF LABOR IN I O BufferedReader Class Instance of BufferedReader Object Intantiates Uses Invokes methods in Main class that does I O 28 BUFFEREDREADER OPERATIONS Multi line input stream Line 1 Line 2 dataIn readLine Line 1 dataIn readLine Line 2 dataIn readLine IOException Line stream 29 SCANNER INTERFACE Input stream token 1 token 2 scanner next token 1 scanner next token 2 scanner next Token Stream ScannerException 30 SCANNER INTERFACE Input stream token 1 token 2 scanner next token 1 scanner next token 2 scanner hasNext scanner next Token Stream false 31 UPPERCASE SCANNER INTERFACE J token 1 o h n F token 2 K J scanner next F scanner next K scanner next n n e d y token 3 scanner next scanner hasNext e false Can check hasNext before calling next 32 MULTIPLE ITERATOR INTERFACES package iterators public interface CharIterator public char next public boolean hasNext package iterators public interface StringIterator public String next public boolean hasNext package P public interface Type Iterator public Type next public boolean hasNext 33 USING AN ITERATOR INTERFACE J token 1 o h n F token 2 K e n n e d y token 3 public static void printChars CharIterator charIterator while charIterator hasNext System out print charIterator next Normally need to check hasNext before each call to next Unless expecting a certain minimum number of tokens e g move 50 34 REDOING UPPERCASEPRINTER package main import iterators CharIterator import iterators AnUpperCaseIterator public class UpperCasePrinter public static void main String args printUpperCase args 0 public static void printUpperCase String s System out println Upper Case Letters printChars new AnUpperCaseIterator s public static void printChars CharIterator charIterator while charIterator hasNext System out print charIterator next 35 IMPLEMENTING SCANNER package
View Full Document
Unlocking...