7.2 Strings and String Operations
Key Takeaways
- In ETS pseudocode, strings are concatenated with + and characters are usually numbered from position 0.
- When a method table says substring ( begin, end ) returns positions begin through end − 1, "computer".substring ( 3, 6 ) is "put".
- String methods such as toUpperCase ( ) return a new string; unless the result is assigned or printed, the original value is unchanged.
- Comparisons of strings use character codes, so uppercase letters (65–90 in ASCII) sort before lowercase letters (97–122).
- In Java, compare string contents with equals, not ==, which compares object references.
What this competency asks
Within data types, ETS lists: identify the correct sequence of string operations to produce a given output. The discussion questions add: evaluate an expression that uses string operations. ETS's sample question on strings provides a table of methods (toLowerCase, toUpperCase, substring, and length) and asks which code segment turns "Applesauce" into "aPPLESAUCE". The skill is reading a method specification precisely and composing calls in the right order.
String basics
A string is a sequence of characters. Assume the positions are numbered starting at 0, as ETS's sample table states:
| Position | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
"computer" | c | o | m | p | u | t | e | r |
- Length: 8. The last position is length − 1 = 7.
- Concatenation:
"com" + "puter"is"computer"."Score: " + 95is"Score: 95". - Empty string:
""has length 0.
A typical method table
Questions define the methods they use. A representative table looks like this:
| Method | Behavior |
|---|---|
int length ( ) | Returns the number of characters |
String substring ( int begin, int end ) | Returns the characters from position begin through end − 1. ETS's sample table also returns "" for invalid positions |
String toUpperCase ( ) | Returns the string with letters converted to uppercase |
String toLowerCase ( ) | Returns the string with letters converted to lowercase |
int indexOf ( String s ) | Returns the position of the first occurrence of s, or −1 if it does not occur |
Always use the table given in the question. Some languages define substring as (start, length) instead of (start, end). On the test, the stem's definition wins.
Reading substring correctly
With an exclusive end position:
Call on "computer" | Result | Why |
|---|---|---|
substring ( 0, 1 ) | "c" | Position 0 only |
substring ( 3, 6 ) | "put" | Positions 3, 4, 5 |
substring ( 1, length ( ) ) | "omputer" | Position 1 to the end |
substring ( 4, 4 ) | "" | begin = end gives no characters |
A useful identity: substring ( a, b ) has length b − a.
Composing operations to produce an output
Goal: turn "hELLO" into "Hello".
- The first character must become uppercase:
value.substring ( 0, 1 ).toUpperCase ( )gives"H". - The rest must become lowercase:
value.substring ( 1, value.length ( ) ).toLowerCase ( )gives"ello". - Concatenate:
"H" + "ello"gives"Hello".
String value ← "hELLO"
value ← value.substring ( 0, 1 ).toUpperCase ( ) + value.substring ( 1, value.length ( ) ).toLowerCase ( )
print value
Traps in the answer choices usually include:
- Converting the whole string in two steps, such as
toUpperCasefollowed bytoLowerCase. The second call undoes the first. - A substring that overlaps or skips a character, such as
substring ( 0, 2 )followed bysubstring ( 1, … ), which repeats position 1. - Calling a method without assigning or using the result. Methods like
toUpperCase ( )return a new string; in most languages strings are immutable, so the original is unchanged.
Building and processing strings with loops
Reversing a string
String word ← "code"
String result ← ""
for ( int i ← word.length ( ) - 1; i ≥ 0; i ← i - 1 )
result ← result + word.substring ( i, i + 1 )
end for
print result
| i | Character added | result |
|---|---|---|
| 3 | e | "e" |
| 2 | d | "ed" |
| 1 | o | "edo" |
| 0 | c | "edoc" |
Output: edoc. The loop starts at length ( ) - 1, not length ( ), which would be past the end.
Counting a character
int count ← 0
for ( int i ← 0; i < text.length ( ); i ← i + 1 )
if ( text.substring ( i, i + 1 ) == "a" )
count ← count + 1
end if
end for
Other common patterns follow the same shape: checking for a palindrome (compare position i with position length − 1 − i), removing spaces (append only non-space characters), and finding the first vowel (stop when found).
Comparing strings
- Equality: in ETS pseudocode
==compares values. In Java,==compares object references. Usea.equals ( b )to compare contents, ora.equalsIgnoreCase ( b )to ignore case. - Ordering: strings are ordered lexicographically by character codes, like dictionary order but by code value. In ASCII,
'A'is 65 and'a'is 97, so"Zebra"comes before"apple". Digits (48–57) come before uppercase letters. Converting both strings to the same case gives a case-insensitive ordering. - Comparison stops at the first differing character.
"cat"comes before"cattle"because it runs out of characters first.
Converting between strings and numbers
Input from a keyboard or a text file arrives as a String. "42" + 1 concatenates to "421", while converting first, as with Integer.parseInt ( "42" ) + 1 in Java, gives 43. Going the other way, concatenating a number with a string converts the number to text. Programs that ask users for numbers should validate the text before converting it (Section 11.2).
Using a method table in which substring ( begin, end ) returns positions begin through end − 1 and the first character is at position 0, which code segment prints "Maple" when value is "mAPLE"?
With positions numbered from 0 and substring ( begin, end ) returning positions begin through end − 1, what does "computer".substring ( 3, 6 ) return?
What is printed?
String word ← "loop"
String result ← ""
for ( int i ← word.length ( ) - 1; i ≥ 0; i ← i - 1 )
result ← result + word.substring ( i, i + 1 )
end for
print result