Presentation is loading. Please wait.

Presentation is loading. Please wait.

Object-based Scanning Redo the scanning solution Monolithic, single class solution –does UI and scanning No reuse of code Another scanning problem to.

Similar presentations


Presentation on theme: "Object-based Scanning Redo the scanning solution Monolithic, single class solution –does UI and scanning No reuse of code Another scanning problem to."— Presentation transcript:

1

2 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.

3 Scanning Problem

4 Upper case printing package warmup; public class AnUpperCasePrinter { public static void main(String[] args){ if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } System.out.println("Upper Case Letters:"); int index = 0; while (index < args[0].length()) { if (isUpperCase(args[0].charAt(index))) System.out.print(args[0].charAt(index)); index++; } System.out.println(); } public static boolean isUpperCase(char c) { return (c >= 'A') && (c <= 'Z'); }

5 Printing Scanned Characters Backwards Cannot scan multiple times

6 Strings = Char Sequences JohnF.Kenndye hello String{sequences of characters} 143l0

7 Other Sequences as Predefined Types 100989910090 604050 {sequences of integers} 80 JFKFDR {sequence of Strings} JCBCRRGB 3.83.1 {sequences of doubles} 3.73.13.63.9 IntSequence DoubleSequence StringSequence

8 Other Sequences as Array Types 100989910090 604050 {sequences of integers} 80 {sequence of strings} 3.83.1 {sequences of doubles} 3.73.13.63.9 int[] double[] String[] JFKFDRJCBCRRGB

9 Initializing Array Declarations 10098991009080 int[] assignmentScores = {100, 98, 99, 80}; 3.83.13.73.13.63.9 double[] gpas = {3.8, 3.1, 3.7, 3.1, 3.6, 3.9};String[] initials = {“JFK”, “FDR”, “JC”, “BC”, “GW”, “WW”}; JFKFDRJCBCGWWW assignmentScores Array Type Element Type Array Literal Array Variable

10 Array Operations String[] initials = {“JFK”, “FDR”, “JC”, “BC”, “GW”, “WW”}; JFKFDRJCBCGWWW initials.length  6 initials[0] initials[initials.length - 1] initials[initials.length]  ArrayIndexOutOfBoundsException public named constant initials[0] = “HT” HT initials[initials.length] = “HT”  ArrayIndexOutOfBoundsException Array Instance Size Fixed

11 Array Types have Variable-Size 100989910090 604050 80 int[] 10098991009080 int[] assignmentScores = {100, 98, 99, 100, 99, 80}; assignmentScores assignmentScores = {60, 40, 50}; assignmentScores 604050

12 Uninitializing Array Declaration int[] assignmentScores; assignmentScores null assignmentScores = {60, 40, 50}; assignmentScores 604050

13 Array Elements Uninitialized int[] assignmentScores = new int[3]; assignmentScores 000

14 Printing Scanned Characters Backwards

15 Variable-Size Collection filled part unfilled part current size maximum size

16 3 J F K sizearray Variable-Size Collection filled part unfilled part current size maximum size

17 Variable-Size Collection static final int MAX_CHARS = 7; static char[] upperCaseLetters = new char [MAX_CHARS]; static int numberOfUpperCaseLetters = 0;

18 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){ if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } 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(); }

19 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]); }

20 No reuse 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 storeChar(args[0].charAt(index)); } index ++; } 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 ++; }

21 Class Decomposition? Main Class

22 Division of Labor in Radio Scanning

23

24

25

26

27

28

29 ?

30

31 Scanner Object calls Scanner User Main Class (Input & Output) Class Decomposition Scanner Class instantiate

32 BufferedReader Instance readLine() Scanner User Main Class (Input & Output) Class Decomposition BufferedReader instantiate

33 Scanner User-Scanner Object Interaction 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);

34 Constructor parameters InputStreamReader takes System.in as parameter. BufferedReader takes InputStreamReader as parameter. In general, scanner takes object producing scanned stream as parameter.

35 BufferedReader Operations Line 1Line 2 Multi-line input stream Line stream dataIn.readLine()Line 1 dataIn.readLine()Line 2 dataIn.readLine()IOException

36 Scanner Interface? scanner.nextElement()token 1 scanner.nextElement()token 2 scanner.nextElement()ScannerException token 1token 2 Input stream Token Stream

37 Scanner Interface? scanner.nextElement()token 1 scanner.nextElement()token 2 scanner.hasMoreElements()false Input stream Token Stream token 1token 2 scanner.nextElement()???

38 Uppercase Scanner Interface? scanner.nextElement()‘J’ scanner.nextElement()‘F’ scanner.hasMoreElements()false JohnF.Kenndye token 1token 2token 3 scanner.nextElement()‘K’ scanner.nextElement()???

39 Enumeration Interfaces package enums; public interface CharEnumeration { public char nextElement(); public boolean hasMoreElements(); } package enums; public interface StringEnumeration { public String nextElement(); public boolean hasMoreElements(); } package ; public interface Enumeration { public nextElement(); public boolean hasMoreElements(); }

40 Using an Enumeration Interface public static void printChars (CharEnumeration charEnumeration) { while (charEnumeration.hasMoreElements()) System.out.print(charEnumeration.nextElement()); } JohnF.Kenndye token 1token 2token 3

41 Using an Enumeration Interface package main; import enums.CharEnumeration; import enums.AnUpperCaseEnumeration; public class UpperCasePrinter { public static void main (String args[]) { if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } printUpperCase(args[0]); } public static void printUpperCase(String s) { System.out.println("Upper Case Letters:"); printChars (new AnUpperCaseEnumeration(s)); } public static void printChars (CharEnumeration charEnumeration) { while (charEnumeration.hasMoreElements()) System.out.print(charEnumeration.nextElement()); }

42 Implementing Scanner package enums; public class AnUpperCaseEnumeration implements CharEnumeration { … public AnUpperCaseEnumeration(String theString) {... } public boolean hasMoreElements() {... } public char nextElement() {...; } … }

43 Data Structure: Scanned String package enums; public class AnUpperCaseEnumeration implements CharEnumeration { String string; … public AnUpperCaseEnumeration(String theString) { string = theString;... } public boolean hasMoreElements() {... } public char nextElement() {...; } … }

44 Data Structure: marker JohnF.Kenndye nextElementPos string scanned partUnscanned part nextElementPos is global rather than loop variable

45 hasMoreElements() JohnF.Kenndye string nextElementPos public boolean hasMoreElements() {... } true

46 hasMoreElements() JohnF.Kenndye string nextElementPos public boolean hasMoreElements() {... } true

47 hasMoreElements() JohnF.Kenndye string nextElementPos public boolean hasMoreElements() {... } false

48 hasMoreElements() JohnF.Kenndye string nextElementPos //return true if nextElementPos is beyond end of string; false otherwise public boolean hasMoreElements() {... }

49 hasMoreElements() JohnF.Kenndye string nextElementPos //return false if nextElementPos is beyond end of string; true otherwise public boolean hasMoreElements() { return nextElementPos < string.length(); }

50 nextElement() JohnF.Kenndye string nextElementPos public char nextElement() { }

51 nextElement() JohnF.Kenndye string nextElementPos //Assume nextElemPos is at start of next token or end of string when //method is called. //Method makes sure this is also true before returning. //returns next element if one exists public char nextElements() { }

52 nextElement() JohnF.Kenndye string nextElementPos //Assume nextElemPos is at start of next token or end of string when //method is called. //Method makes sure this is also true before returning. //returns next element if one exists public char nextElement() { } char retVal = string.charAt(nextElemPos) return retVal; while (!isUpperCase(string.charAt(nextElementPos))) nextElemPos++; Unexecuted Loop

53 nextElement() JohnF.Kenndye string nextElementPos //Assume nextElemPos is at start of next token or end of string when //method is called. //Method makes sure this is also true before returning. //returns next element if one exists public char nextElements() { } movePastCurrentToken(); char retVal = extractToken(); return retVal; skipNonTokenCharacters();

54 nextElement() JohnF.Kenndye string nextElementPos //Assume nextElemPos is at start of next token or end of string when //method is called. //returns next token if one exists public char extractToken() { } return string.charAt(nextElementPos);

55 movePastCurrentToken() //Assume nextElemPos is at start of next token or end of string when //method is called. //Moves past current token. public void movePastCurrentToken() { } nextElemPos++; JohnF.Kenndye string nextElementPos

56 skipNonTokenCharacters() JohnF.Kenndye string nextElementPos // keep advancing nextElementPos until we hit the next upper case public void skipNonTokenCharacters() { } while (! isUpperCase(string.charAt(nextElementPos))) nextElemPos++; StringIndexOutOfBounds

57 skipNonTokenCharacters() JohnF.Kenndye string nextElementPos // keep advancing nextElementPos until we hit the next upper case or go // beyond the end of the string. public void skipNonTokenCharacters() { } while (nextElementPos < string.length() && !Character.isUpperCase(string.charAt(nextElement Pos))) nextElemPos++; StringIndexOutOfBounds?short-circuit

58 Initialization johnF.Kenndye string nextElementPos String string; int nextElementPos = 0; public AnUpperCaseEnumeration(String theString) { } string = theString; skipNonTokenCharacters();

59 Complete Scanner package enums; public class AnUpperCaseEnumeration implements CharEnumeration { String string; int nextElementPos = 0; public AnUpperCaseEnumeration(String theString) { string = theString; skipNonTokenCharacters(); } public boolean hasMoreElements() { return nextElementPos < string.length();} public char nextElement() { char retVal = extractToken(); movePastCurrentToken(); skipNonTokenCharacters(); return retVal; } void movePastCurrentToken() {nextElementPos++;} void skipNonTokenCharacters() { while (nextElementPos < string.length() && !isUpperCase(string.charAt(nextElementPos))) nextElementPos++; } char extractToken() { return string.charAt(nextElementPos);} boolean isUpperCase (char c) { return c >= ‘A’ && c <= ‘Z’;} } constructor

60 Scanner Pattern package ; public class implements Enumeration { String string; int nextElementStart = 0; int nextElementEnd = ???; public AnUpperCaseEnumeration(String theString) { string = theString; skipNonTokenCharacters(); } public boolean hasMoreElements() { return nextElementStart < string.length();} public nextElement() { retVal = extractToken(tokenLength); movePastCurrentToken(tokenLength); skipNonTokenCharacters(); return retVal; } void movePastCurrentToken() {…}; void skipNonTokenCharacters() {…}; char extractToken() { …} }

61 AnUpperCaseEnumeration instance Class Decomposition AnUpperCaseEnumeration instantiate AnUppercasePrinter

62 AnUpperCaseEnumeration instance Class Decomposition AnUpperCaseEnumeration instantiate AReverseUpperCasePrinter

63 Reuse of Enumeration while (charEnumeration.hasMoreElements()) { char nextChar = charEnumeration.nextElement()); System.out.print(nextChar); storeChar(nextChar); } while (charEnumeration.hasMoreElements()) System.out.print(charEnumeration.nextElement());

64 Enumeration vs. Scanning public interface CharEnumeration { public char nextElement(); public boolean hasMoreElements(); } JohnF.Kenndye token 1token 2token 3

65 Enumeration without Scanning public interface CharEnumeration { public char nextElement(); public boolean hasMoreElements(); } AllUppercaseLettersInOrder implements ‘A’‘B’...‘Z’

66 Enumerating all Uppercase Letters public boolean hasMoreElements() { ???? } public char nextElement() { ??? } //instance variables ???

67 Enumerating all Uppercase Letters package enumerations; public class AllUpperCaseLettersInOrder implements CharEnumeration { char nextLetter = 'A'; public boolean hasMoreElements() { return nextLetter <= 'Z'; } public char nextElement() { char retVal = nextLetter; nextLetter = (char) (nextLetter + 1); return retVal; }

68 Comparing Two Implementations public interface CharEnumeration { public char nextElement(); public boolean hasMoreElements(); } JohnF.Kenndye token 1token 2token 3 AnUpperCaseEnumeration implements ‘J’‘F’‘K’

69 Radically Different Behaviors public interface CharEnumeration { public char nextElement(); public boolean hasMoreElements(); } AllUppercaseLettersInOrder implements ‘A’‘B’...‘Z’ print (new AnUppercaseEnumeration(s)); print (new AllUppercaseLettersInOrder()); Polymorphism Syntactic Specification!

70 Forward and reverse printing package main; import enums.CharEnumeration; import enums.AnUpperCaseEnumeration; 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){ if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } printAndStore(args[0]); printReverse(); }

71 Forward and reverse printing public static void printAndStore (String s) { System.out.println("Upper Case Letters:"); printAndStore (new AnUpperCaseEnumeration(s)); } public static void printAndStore (CharEnumeration charEnumeration) { while (charEnumeration.hasMoreElements()) { char inputChar = charEnumeration.nextElement(); System.out.print (inputChar); storeChar(inputChar); } System.out.println(); }

72 Forward and reverse printing (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]); }

73 Remaining problems package main; import enums.CharEnumeration; import enums.AnUpperCaseEnumeration; 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){ if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } printAndStore(args[0]); printReverse(); }

74 Remaining Problems Main class does storing Non UI code Array, size, and max size closely coupled to each other Should be in separate class

75 3 J F K sizearray Variable-Size Collection filled part unfilled part current size maximum size

76 Variable-Size Collection public class { … final static T A_MAX_SIZE = 50; T[] a = new T [MAX_SIZE]; int aSize = 0; … //process a for (int index = 0; index < aSize; index++) System.out.println(a[index]); … final int B_MAX_SIZE = 50; T[] b = new T [MAX_SIZE]; int bSize = 0; //process b … }

77 Special Type public class {... AVariableSizeTCollection a, b = new AVariableSizeTCollection();... for (int index = 0; index < a.size; index++) System.out.println(a.contents[index]); … AVariableSizeTCollection b = new AVariableSizeTCollection();... } public class AVariableSizeTCollection { public static final int MAX_SIZE = ???; public T[] contents = new T [MAX_SIZE]; public int size = 0; } No encapsulation! a.size = 0; Constraints violated

78 Supporting Encapsulation package collections; public interface …. { public static final int MAX_SIZE = 50; } public void addElement (char element); public void printReverse (); Implementation specific User specific

79 Supporting Encapsulation package collections; public interface CharHistory { } public void addElement (char element); public int size(); public char elementAt (int index);

80 Implementing the History package collections; public class ACharHistory implements CharHistory { public final int MAX_SIZE = 5; char[] contents = new char[MAX_SIZE]; int size = 0; public int size() { return size;} public char elementAt (int index) { return contents[index]; } boolean isFull() { return size == MAX_SIZE; } public void addElement(char element) { if (isFull()) { System.out.println("Adding item to a full history. Terminating program."); System.exit(-1); } else { contents[size] = element; size++; }

81 Using the History package main; import enums.CharEnumeration; import enums.AnUpperCaseEnumeration; import collections.ACharHistory; import collections.CharHistory; public class AModularReverseUpperCasePrinter { static CharHistory upperCaseLetters = new ACharHistory(); public static void main(String[] args) { if (args.length != 1) { System.out.println("Illegal number of arguments:" + args.length + ". Terminating program."); System.exit(-1); } printAndStore(args[0]); printReverse(); }

82 Using the History public static void printAndStore (String s) { System.out.println("Upper Case Letters:"); printAndStore (new AnUpperCaseEnumeration(s)); } public static void printAndStore (CharEnumeration charEnumeration) { while (charEnumeration.hasMoreElements()) { char inputChar = charEnumeration.nextElement(); System.out.print (inputChar); upperCaseLetters.addElement(inputChar); } System.out.println(); }

83 Forward and reverse printing (contd.) public static void printReverse() { System.out.println("Upper Case Letters in Reverse:"); for (int index =upperCaseLetters.size() - 1; index >= 0; index--) { System.out.print(upperCaseLetters.elementAt(index)); }


Download ppt "Object-based Scanning Redo the scanning solution Monolithic, single class solution –does UI and scanning No reuse of code Another scanning problem to."

Similar presentations


Ads by Google