1 CSC 221: Computer Programming I Fall 2005 Repetition and Text Processing  Java Strings: declaration, assignment, printing, concatenation  String traversal,

Slides:



Advertisements
Similar presentations
1 CSC 221: Computer Programming I Fall 2006 interacting objects modular design: dot races constants, static fields cascading if-else, logical operators.
Advertisements

Liang, Introduction to Java Programming, Ninth Edition, (c) 2013 Pearson Education, Inc. All rights reserved. 1 Chapter 9 Strings.
Chapter 1 Object-Oriented Concepts. A class consists of variables called fields together with functions called methods that act on those fields.
Chapter 7 Strings F To process strings using the String class, the StringBuffer class, and the StringTokenizer class. F To use the String class to process.
1 Strings and Text I/O. 2 Motivations Often you encounter the problems that involve string processing and file input and output. Suppose you need to write.
Java Programming Strings Chapter 7.
1 CSC 221: Computer Programming I Fall 2004 String manipulation  Java Strings: declaration, assignment, printing, concatenation  String traversal, construction,
 2005 Pearson Education, Inc. All rights reserved Introduction.
1 Chapter 2 Introduction to Java Applications Introduction Java application programming Display ____________________ Obtain information from the.
28-Jun-15 String and StringBuilder Part I: String.
Strings as objects Strings are objects. Each String is an instance of the class String They can be constructed thus: String s = new String("Hi mom!");
Java Programming: From Problem Analysis to Program Design, 4e Chapter 7 User-Defined Methods.
Chapter 7: User-Defined Methods
COMP 110 Introduction to Programming Mr. Joshua Stough September 10, 2007.
1 CSC 222: Computer Programming II Spring 2005 Searching and efficiency  sequential search  big-Oh, rate-of-growth  binary search  example: spell checker.
1 CSC 221: Introduction to Programming Fall 2011 Text processing  Python strings  indexing & slicing, len function  functions vs. methods  string methods:
1 CSC 222: Object-Oriented Programming Spring 2012 Simulations & library classes  HW3: RouletteWheel, RouletteGame, RouletteTester  javadoc  java.lang.
1 CSC 222: Object-Oriented Programming Spring 2012 Lists, data storage & access  ArrayList class  methods: add, get, size, remove, contains, set, indexOf,
1 CSC 221: Introduction to Programming Fall 2012 Functions & Modules  standard modules: math, random  Python documentation, help  user-defined functions,
1 CSC 221: Computer Programming I Spring 2010 interaction & design  modular design: roulette game  constants, static fields  % operator, string equals.
1 CSC 221: Introduction to Programming Fall 2012 Text processing  Python strings  indexing & slicing, len function  functions vs. methods  string methods:
1 CSC 222: Object-Oriented Programming Spring 2012 Object-oriented design  example: word frequencies w/ parallel lists  exception handling  System.out.format.
1 CSC 221: Computer Programming I Spring 2008 ArrayLists and arrays  example: letter frequencies  autoboxing/unboxing  ArrayLists vs. arrays  example:
Introduction to Java Applications Part II. In this chapter you will learn:  Different data types( Primitive data types).  How to declare variables?
The while Loop Syntax while (condition) { statements } As long condition is true, the statements in the while loop execute.
The while Loop Syntax while (condition) { statements } As long condition is true, the statements in the while loop execute.
EXAM 1 REVIEW. days until the AP Computer Science test.
A Balanced Introduction to Computer Science, 3/E David Reed, Creighton University ©2011 Pearson Prentice Hall ISBN Chapter 15 JavaScript.
Java Programming: From Problem Analysis to Program Design, 4e Chapter 2 Basic Elements of Java.
 Pearson Education, Inc. All rights reserved Introduction to Java Applications.
1 CSC 221: Computer Programming I Spring 2008 Class design & strings  design principles  cohesion & coupling  class example: graphical DotRace  static.
1 CSC 221: Computer Programming I Fall 2004 Lists, data access, and searching  ArrayList class  ArrayList methods: add, get, size, remove  example:
1 CSC 222: Object-Oriented Programming Spring 2013 Lists, data storage & access  ArrayList class  methods: add, get, size, remove, contains, set, indexOf,
1 CSC 221: Computer Programming I Spring 2008 Lists, data storage & access  ArrayList class  methods: add, get, size, remove, contains, set, indexOf,
Topic 1 Object Oriented Programming. 1-2 Objectives To review the concepts and terminology of object-oriented programming To discuss some features of.
1 CSC 221: Computer Programming I Spring 2010 Design & text processing  design principles  cohesion & coupling  objects vs. primitives  String methods:
CS 106 Introduction to Computer Science I 10 / 29 / 2007 Instructor: Michael Eckmann.
Chapter 3: Classes and Objects Java Programming FROM THE BEGINNING Copyright © 2000 W. W. Norton & Company. All rights reserved Java’s String Class.
1 CSC 221: Introduction to Programming Fall 2011 Lists  lists as sequences  list operations +, *, len, indexing, slicing, for-in, in  example: dice.
CSC 1051 M.A. Papalaskari, Villanova University Everyday objects: Strings and Wrappers CSC 1051 – Data Structures and Algorithms I Dr. Mary-Angela Papalaskari.
Strings Mr. Smith AP Computer Science A. What are Strings? Name some of the characteristics of strings: A string is a sequence of characters, such as.
1 CSC 221: Computer Programming I Fall 2009 Class design & strings  design principles  cohesion & coupling  example: graphical DotRace  objects vs.
Chapter 3A Strings. Using Predefined Classes & Methods in a Program To use a method you must know: 1.Name of class containing method (Math) 2.Name of.
1 CSC 221: Computer Programming I Fall 2005 Class design & strings  design principles  cohesion & coupling  class examples: Hurricane, TaxReturn  objects.
1 CSC 221: Introduction to Programming Fall 2012 Lists  lists as sequences  list operations +, *, len, indexing, slicing, for-in, in  example: dice.
1 CSC 221: Computer Programming I Fall 2005 simple conditionals and expressions  if statements, if-else  increment/decrement, arithmetic assignments.
1 Predefined Classes and Objects Chapter 3. 2 Objectives You will be able to:  Use predefined classes available in the Java System Library in your own.
17-Feb-16 String and StringBuilder Part I: String.
Strings and I/O. Lotsa String Stuff… There are close to 50 methods defined in the String class. We will introduce several of them here: charAt, substring,
Java Programming: From Problem Analysis to Program Design, Second Edition 1 Lecture 1 Objectives  Become familiar with the basic components of a Java.
COMP 110: Spring Announcements Program 5 Milestone 1 was due today Program 4 has been graded.
CSC 221: Computer Programming I Fall 2001  C++ libraries  cmath, cctype  classes and objects  abstract data types, classes and objects  data fields,
1 Agenda  Unit 7: Introduction to Programming Using JavaScript T. Jumana Abu Shmais – AOU - Riyadh.
1 A Balanced Introduction to Computer Science, 2/E David Reed, Creighton University ©2008 Pearson Prentice Hall ISBN Chapter 15 JavaScript.
CSC 222: Object-Oriented Programming Fall 2017
Java Programming: From Problem Analysis to Program Design, 3e Chapter 7 User-Defined Methods.
Building Java Programs
CSC 222: Object-Oriented Programming Fall 2017
CSC 222: Object-Oriented Programming Fall 2017
CSC 221: Computer Programming I Fall 2005
Program Style Console Input and Output
CS 106A, Lecture 9 Problem-Solving with Strings
Chapter 7: Strings and Characters
Arrays We often want to organize objects or primitive data in a way that makes them easy to access and change. An array is simple but powerful way to.
CSC 221: Introduction to Programming Fall 2018
CSC 221: Computer Programming I Fall 2009
CSC 222: Object-Oriented Programming Spring 2013
Using Objects (continued)
String methods 26-Apr-19.
CSC 222: Object-Oriented Programming Spring 2012
Presentation transcript:

1 CSC 221: Computer Programming I Fall 2005 Repetition and Text Processing  Java Strings: declaration, assignment, printing, concatenation  String traversal, construction, Character.toLowerCase  String methods: length, charAt, indexOf, substring  applications: Pig Latin translator  file input: Scanner, File, exceptions  Scanner methods: next, hasNext, nextLine, hasNextLine, nextInt, hasNextInt

2 Java strings recall: String is a Java class that is automatically defined for you  a String object encapsulates a sequence of characters  you can declare a String variable and assign it a value just like any other type String firstName = "Dave";  you can display Strings using System.out.print and System.out.println System.out.println(firstName);  the '+' operator concatenates two strings (or string and number) together String str = "foo" + "lish"; str = str + "ly"; int age = 19; System.out.println("Next year, you will be " + (age+1));

3 String methods in addition, there are many useful methods defined for Strings int length() returns the length of the String str char charAt(int index) returns the character at specified index first index is 0 last index is str.length()-1 if index = str.length(), an error occurs String str = "foobar"; for (int i = 0; i < str.length(); i++) { System.out.print(str.charAt(i)); } String str = "foobar"; for (int i = str.length()-1; i >= 0; i--) { System.out.print(str.charAt(i)); } String str = "foobar"; System.out.println( str.length() ); System.out.println( str.charAt(0) ); System.out.println( str.charAt(1) ); System.out.println( str.charAt(str.length()-1) );

4 Traversing & constructing Strings since the length of a String can be determined using the length method, a for loop can be used to traverse the String  as you access individual characters, can test and act upon values  can even construct a new string out of individual characters String str = "zaboomofoo"; int count = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == 'o') { count++; } String copy = ""; for (int i = 0; i < str.length(); i++) { copy = str.charAt(i) + copy; } String copy = ""; for (int i = 0; i < str.length(); i++) { copy = copy + str.charAt(i); }

5 String utilities we can define and encapsulate additional string operations in a class  StringUtils will not have any fields, it simply encapsulates methods  can define methods to be static – static methods can be called directly on the class public class StringUtils { /** * Reverses a string. str the string to be reversed a copy of str with the order of the characters reversed */ public static String reverse(String str) { String copy = ""; for (int i = 0; i < str.length(); i++) { copy = str.charAt(i) + copy; } return copy; }. }

6 Stripping a string consider the task of removing spaces from a string  need to traverse the string and check each char to see if it is a space  if it is not, add that char to the copy string  if it is a space? /** * Strips all spaces out of a string. str the string to be stripped a copy of str with each space removed */ public static String stripSpaces(String str) { String copy = ""; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) != ' ') { copy += str.charAt(i); } return copy; }

7 Censoring a string consider the task of censoring a word, i.e., replacing each vowel with ' * '  need to traverse the string and check each char to see if it is a vowel  if it is a vowel, add ' * ' to the copy string  if it is not, add the char to the copy string /** * Censors a string by replacing all vowels with asterisks. str the string to be censored a copy of str with each vowel replaced by an asterisk */ public static String censor(String str) { String copy = ""; for (int i = 0; i < str.length(); i++) { if (isVowel(str.charAt(i))) { copy += '*'; } else { copy += str.charAt(i); } return copy; } /** * Determines if a character is a vowel (either upper or lower case). ch the character to be tested true if ch is a vowel, else false */ public static boolean isVowel(char ch) { ????????? }

8 Testing for a vowel a brute force approach would be to test every vowel separately TEDIOUS! public static boolean isVowel(char ch) { if (ch == 'a') { return true; } else if (ch == 'A') { return true; } else if (ch == 'e') { return true; } else if (ch == 'E') { return true; }. else if (ch == 'u') { return true; } else if (ch == 'U') { return true; } else { return false; }

9 Testing for a vowel (cont.) we could simplify the code using the Character.toLowerCase method  toLowerCase is a static method of the Character class  it takes a character as input, and returns the lower case equivalent  if the input is not a letter, then it simply returns it unchanged public static boolean isVowel(char ch) { ch = Character.toLowerCase(ch); if (ch == 'a') { return true; } else if (ch == 'e') { return true; } else if (ch == 'i') { return true; } else if (ch == 'o') { return true; } else if (ch == 'u') { return true; } else { return false; }

10 Testing for a vowel (cont.) could simplify using || public static boolean isVowel(char ch) { ch = Character.toLowerCase(ch); if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') { return true; } else { return false; } public static boolean isVowel(char ch) { ch = Character.toLowerCase(ch); return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'); } since the code returns the same value as the test, can avoid the if altogether recall: boolean expressions involving || or && are evaluated intelligently via short-circuit evaluation expressions are evaluated left to right can stop evaluating || expression as soon as a part evaluates to true  entire expression is true can stop evaluating && expression as soon as a part evaluates to false  entire expression is false

11 Testing for a vowel (cont.) best solution involves the String method: int indexOf(char ch) int indexOf(String str) returns the index where ch/str first appears in the string (-1 if not found) for isVowel :  create a String that contains all the vowels  to test a character, call indexOf to find where it appears in the vowel String  if return value != -1, then it is a vowel public static boolean isVowel(char ch) { String VOWELS = "aeiouAEIOU"; return (VOWELS.indexOf(ch) != -1); }

12 Substring the last String method we will consider is substring: String substring(int start, int end) returns the substring starting at index start and ending at index end-1 e.g., String str = "foobar"; str.substring(0,3)  "foo" str.substring(3, str.length())  "bar" /** * Capitalizes the first letter in the string. str the string to be capitalized a copy of str with the first letter capitalized */ public static String capitalize(String str) { return Character.toUpperCase(str.charAt(0)) + str.substring(1, str.length()); }

13 Pig Latin /** * Translates a string into Pig Latin str the string to be converted a copy of str translated into Pig Latin */ public static String pigLatin(String str) { return str.substring(1, str.length()) + str.charAt(0) + "ay"; } suppose we want to translate a word into Pig Latin  simplest version nix  ixnaypig  igpay latin  atinlaybanana  ananabay  to translate a word, move the last letter to the end and add "ay"

14 opsoay? using our method, oops  opsoayapple  ppleaay for "real" Pig Latin, you must consider the first letter of the word  if a consonant, then translate as before (move first letter to end then add "ay")  if a vowel, simply add "way" to the end oops  oopsway apple  appleway public static String pigLatin(String str) { if (isVowel(str.charAt(0))) { return str + "way"; } else { return str.substring(1, str.length()) + str.charAt(0) + "ay"; }

15 reightoncay? using our method, creighton  reightoncaythrill  hrilltay so, we need to be able to find the first occurrence of a vowel HOW? for "real" Pig Latin, if the word starts with a sequence of consonants, must move the entire sequence to the end then add "ay" creighton  eightoncray thrill  illthray

16 Handling multiple consonants /** * Finds the first occurrence of a vowel in a string. str the string to be searched the index where the first vowel in str occurs (-1 if no vowel) */ private static int findVowel(String str) { for (int i = 0; i < str.length(); i++) { if (isVowel(str.charAt(i))) { return i; } return -1; } public static String pigLatin(String str) { int firstVowel = findVowel(str); if (firstVowel <= 0) { return str + "way"; } else { return str.substring(firstVowel, str.length()) + str.substring(0,firstVowel) + "ay"; }

17 In-class exercise modify pigLatin so that it preserves capitalization computer  omputercay science  iencesay Creighton  Eightoncray Nebraska  Ebraskanay Omaha  Omahaway

18 Final version of StringUtils

19 String method summary int length() returns number of chars in String char charAt(int index) returns the character at the specified index (indices range from 0 to str.length()-1) int indexOf(char ch) returns index where the specified char/substring int indexOf(String str) first occurs in the String (-1 if not found) String substring(int start, int end) returns the substring from indices start to (end-1) String toUpperCase() returns copy of String with all letters uppercase String toLowerCase() returns copy of String with all letters lowercase boolean equals(String other) returns true if other String has same value int compareTo(String other) returns -1 if less than other String, 0 if equal to other String, 1 if greater than other String ALSO, from the Character class: char Character.toLowerCase(char ch) returns lowercase copy of ch char Character.toUpperCase(char ch) returns uppercase copy of ch boolean Character.isLetter(char ch) returns true if ch is a letter boolean Character.isLowerCase(char ch) returns true if lowercase letter boolean Character.isUpperCase(char ch) returns true if uppercase letter

20 Testing code when you design and write code, how do you know if it works?  run it a few times and assume it's OK? to be convinced that code runs correctly in all cases, you must analyze the code and identify special cases that are handled  then, define a test data set (inputs & corresponding outputs) that covers those cases  e.g., for Pig Latin, words that start with single consonant:"foo"  "oofay" "banana"  "ananabay" words that start with multiple consonants: "thrill"  "illthray" "cheese"  "eesechay" words that start with vowel: "apple"  "appleway" "oops"  "oopsway" words with no vowels: "nth"  "nthway" words that are capitalized: "Creighton"  "Eightoncray" "Omaha"  "Omahaway"

21 Palindrome suppose we want to define a method to test whether a word is a palindrome (i.e., reads the same forwards and backwards) isPalindrome("bob")  trueisPalindrome("madam")  true isPalindrome("blob")  falseisPalindrome("madame")  false download StringUtils.java define isPalindrome method returns true if the word is a palindrome extend your isPalindrome method to handle phrases  need to ignore spaces, punctuation & capitalization isPalindrome("Madam, I'm Adam.")  true isPalindrome("Able was I ere I saw Elba.")  true isPalindrome("A man, a plan, a canal: Panama.")  true

22 File input so far, our programs have required little input from the user  sufficient to specify parameters when constructing an object or calling a method  what if we want to process lots of data? Java 5.0 introduced the Scanner class that has methods for reading input from a stream (e.g., from the console window or a file) Scanner input = new Scanner(System.in);// creates a Scanner for reading // from the console window Scanner infile = new Scanner(new File("in.txt"));// creates a Scanner for reading // from the file in.txt Scanner methods exist for reading data values from the stream public String next(); // reads & returns the next String (up to whitespace) public boolean hasNext(); // returns true if a String remains to be read public String nextLine(); // reads & returns the next line (up to ) public boolean hasNextLine(); // returns true if a line remains to be read public int nextInt(); // reads & returns the next int value public boolean hasNextInt(); // returns true if an int remains to be read public int nextDouble(); // reads & returns the next int value public boolean hasNextDouble();// returns true if an int remains to be read

23 Revisiting HW3 public class ComparePlans { private ServicePlan plan1; private ServicePlan plan2; private ServicePlan plan3; private ServicePlan plan4; private ServicePlan plan5; public ComparePlans() { plan1 = new ServicePlan("Sprint PCS Fair and Flexible America 400", 24, 35.00, 34.99, 400, 0.05); plan2 = new ServicePlan("Sprint PCS Fair and Flexible America 700", 24, 35.00, 49.99, 700, 0.05); plan3 = new ServicePlan("U.S. Cellular National 800", 24, 30.00, 49.95, 800, 0.40); plan4 = new ServicePlan("Verizon Wireless America's Choice 450", 24, 35.00, 39.99, 450, 0.45); plan5 = new ServicePlan(" Verizon Wireless America's Choice 900 ", 24, 35.00, 59.99, 900, 0.40); } public void compareCosts(int minutesUsed) { System.out.println("Your monthly cost for each plan would be:"); System.out.println(" "); System.out.printf("%s: $%5.2f%n", plan1.getName(), plan1.monthlyCost(minutesUsed)); System.out.printf("%s: $%5.2f%n", plan2.getName(), plan2.monthlyCost(minutesUsed)); System.out.printf("%s: $%5.2f%n", plan3.getName(), plan3.monthlyCost(minutesUsed)); System.out.printf("%s: $%5.2f%n", plan4.getName(), plan4.monthlyCost(minutesUsed)); System.out.printf("%s: $%5.2f%n", plan5.getName(), plan5.monthlyCost(minutesUsed)); } recall the ComparePlans class creates a field for each of the five service plans plan details are hard-coded into the constructor calls

24 Service plan input file Sprint PCS Fair and Flexible America Sprint PCS Fair and Flexible America U.S. Cellular National Verizon Wireless America's Choice Verizon Wireless America's Choice a more general solution might involve a text file: store the details for each of the five plans in a text file can then read the details in when you want to create a ServicePlan object

25 HW3 using an input file import java.util.Scanner; import java.io.File; public class ComparePlans { private ServicePlan plan1; private ServicePlan plan2; private ServicePlan plan3; private ServicePlan plan4; private ServicePlan plan5; public ComparePlans(String filename) throws java.io.FileNotFoundException { Scanner infile = new Scanner(new File(filename)); plan1 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan2 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan3 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan4 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan5 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); }... Scanner is defined in java.util.Scanner File is defined in java.io.File in order to use these classes, must import the files you must specify what is to happen if the file is not found in Java, you either have to define code to handle such errors (later), or simply "throw an exception"

26 HW3 using an input file import java.util.Scanner; import java.io.File; public class ComparePlans { private ServicePlan plan1; private ServicePlan plan2; private ServicePlan plan3; private ServicePlan plan4; private ServicePlan plan5; public ComparePlans(String filename) throws java.io.FileNotFoundException { Scanner infile = new Scanner(new File(filename)); plan1 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan2 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan3 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan4 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); infile.nextLine(); plan5 = new ServicePlan(infile.nextLine(), infile.nextInt(), infile.nextDouble(), infile.nextDouble(), infile.nextInt(), infile.nextDouble()); }... ComparePlans is now more general can change the plans being compared simply by changing the input file WHY THE EXTRA nextLine() ?

27 File processing Scanner infile = new Scanner(new File("nums.txt")); int sum = 0; int count = 0; while (infile.hasNextInt()) { int num = infile.nextInt(); count++; sum += num; } System.out.println("The average is " + (double)sum/count); Scanner infile = new Scanner(new File("words.txt")); int wordCount = 0; while (infile.hasNext()) { String nextWord = infile.next(); wordCount++; } System.out.println("The file contains " + wordCount + " words."); recall: Scanner has methods for detecting whether more input is available  hasNext, hasNextLine, hasNextInt, hasNextDouble can combine these with a while loop to process arbitrarily large files

28 Document class import java.util.Scanner; import java.io.File; public class Document { private int numWords; public Document(String filename) throws java.io.FileNotFoundException { numWords = 0; Scanner infile = new Scanner(new File(filename)); while (infile.hasNext()) { String nextWord = infile.next(); numWords++; } public int getNumWords() { return numWords; } this simple class processes a document it reads words one at a time (delineated by whitespace) it counts the words as they are read in the word count field is accessible via getNumWords

29 Document class import java.util.Scanner; import java.io.File; public class Document { private int numWords; private int longest; public Document(String filename) throws java.io.FileNotFoundException { numWords = 0; longest = 0; Scanner infile = new Scanner(new File(filename)); while (infile.hasNext()) { String nextWord = infile.next(); numWords++; if (longest < nextWord.length()) { longest = nextWord.length(); } public int getNumWords() { return numWords; } public int longetWordLength() { return longest; } here, add an additional field is used to keep track of the longest word length could easily envision other file attributes being stored number of capitalized words number of vowels

30 Document class import java.util.Scanner; import java.io.File; public class Document { private int numWords; private int longest; private int numCaps; private int numVowels; public Document(String filename) throws java.io.FileNotFoundException { numWords = 0; longest = 0; numCaps = 0; numVowels = 0; Scanner infile = new Scanner(new File(filename)); while (infile.hasNext()) { String nextWord = infile.next(); numWords++; if (longest < nextWord.length()) { longest = nextWord.length(); } if (nextWord.charAt(0) == Character.toUpperCase(nextWord.charAt(0))) { numCaps++; } for (int i = 0; i < nextWord.length(); i++) { if (StringUtils.isVowel(nextWord.charAt(i))) { numVowels++; } this is getting messy!

31 Object-oriented design OOD is all about abstraction  a cohesive class models one type of thing, with minimal complexity  loosely coupled classes separate out independent behaviors, minimal interaction  a better design would be to separate out the operations on words get # of characters, determine if capitalized, count vowels  from the overall document processing read the file, get the longest, get # of capitals, get # of vowels

32 Word class public class Word { private String str; public Word(String word) { str = word; } public int getNumChars() { return str.length(); } public int getNumVowels() { int count = 0; for (int i = 0; i < str.length(); i++) { if (StringUtils.isVowel(str.charAt(i))) { count++; } return count; } public boolean isCapitalized() { return str.charAt(0) == Character.toUpperCase(str.charAt(0)); } the Word class can encapsulate all the messy operations on a word does this simple job & does it well!

33 Document class import java.util.Scanner; import java.io.File; public class Document { private int numWords; private int longest; private int numCaps; private int numVowels; public Document(String filename) throws java.io.FileNotFoundException { numWords = 0; longest = 0; numCaps = 0; numVowels = 0; Scanner infile = new Scanner(new File(filename)); while (infile.hasNext()) { Word nextWord = new Word(infile.next()); numWords++; if (longest < nextWord.getNumChars()) { longest = nextWord.getNumChars(); } if (nextWord.isCapitalized()) { numCaps++; } numVowels += nextWord.getNumVowels(); } the Document class is then much simpler can deal with an abstract Word without worrying how it works

34 HW5: Flesch Readability Index HW5 involves processing a text file and calculating a readability index Flesch Index = * (avg # syllables per word) * (avg # words per sentence) Flesch IndexGrade LevelExamples th gradecomics th gradeconsumer ads th gradeAlice in Wonderland th gradeSports Illustrated high school studentTime Magazine college studentNew York Times college graduateAuto insurance < 30law school graduateIRS tax code you will define two classes:  Word class encapsulates a String, with additional operations numChars: number of characters, excluding punctuation numSyllables: (estimated) number of syllables in the word endsWithPunctuation: returns true if word ends with a punctuation mark  Document class encapsulates a text document numWords: total number of words in the document numSyllables: total number of syllables in the document numSentences: total number of sentences in the document fleschIndex: the calculated Flesch readability index gradeLevel: the education level corresponding to that index