findPatterns
public static void findPatterns(String haystack, String[] patterns)
Prints the number of matches between a pattern and
the words in a string (“haystack”). Words
in the haystack string are delimited by the following characters:
·
space (ASCII 0x20)
·
double quotation
mark (ASCII
0x22)
·
single quotation
mark (ASCII
0x27)
·
backspace (ASCII 0x08)
·
horizontal tab (ASCII 0x09)
·
new line (ASCII 0x0A)
·
carriage return (ASCII
0x0D)
·
form feed (ASCII
0x0F)
Only exact matches are counted:
-
Substring matches are
not counted
-
Matching is case
sensitive
Searches for 0 to 5 patterns.
Prints an error message and exits if the passed string array
contains more than 5 elements.
Parameters:
haystack – The
string to be searched.
patterns – An
array of 0 to 5 patterns to search for.
Example:
Code:
String haystack_parm = "To be or
not to be: that is the question.";
String[] patterns_parm =
{"to", "be", "be:", "or not"};
findPatterns(haystack_parm, patterns_parm);
Output:
to:1
be:1
be::1
or
not:0
Notes to developer:
findPatterns is a nice method with
intuitive variable names that make the code easy to read. Way to go! I have a couple of comments that are motivated
by my empathy for potential users of the method.
1.
The error message is more helpful if it provides specific information
about what is wrong. Please consider
this change:
if
(patterns.length > 5)
{System.err.println("You can
search for a maximum of 5 patterns. You
searched for too many patterns: " + patterns.length
);}
2. The
behavior of the method is confusing because the criteria for a valid pattern is
not the same as the criteria for a word that is split from the haystack string.
For example, the method allows a pattern that contains interior blank space but does
not allow a haystack word that contains interior blank space. The result is that a valid pattern can exist
in the haystack string but is not counted.
Consider the example where the
haystack string is “To be or not to be” and a pattern is “To be”. I would expect the count to be 1, but the
output prints 0 occurrences:
To
be:0
Please consider two options for a behavior that is more intuitive
to me 😊 and perhaps to other users:
A.
Restrict the patterns in the same way
that words in the haystack are split. Issue
a warning that a pattern with an interior blank space like “To be” is not
valid. Do not print a count of the
invalid pattern occurrences. A pattern
that contains any of the haystack split characters ([ \"\'\t\n\b\f\r]) is
not valid.
B.
Modify the matching algorithm so that
a pattern like “To be” finds a match in a string like “To be or not to be”.
Please let me know if you have any
questions, and thanks for considering.
--Eric