You can pass arrays when invoking a method. A method may also return an array. For example, the method shown below returns an array that is the reversal of another array:
Line 2 creates a new array result . Lines 4 “7 copies elements from array list to array result . Line 9 returns the array. For example, the following statement returns a new array list2 with elements 6 , 5 , 4 , 3 , 2 , 1 :
int [] list1 = { 1 , 2 , 3 , 4 , 5 , 6 }; int [] list2 = reverse(list1);
Listing 6.4 presents a program to count the occurrences of each letter in an array of characters . The program does the following:
1. | Generate one hundred lowercase letters randomly and assign them to an array of characters, as shown in Figure 6.8. You can obtain a random letter by using the getRandomLowerCaseLetter() method in the RandomCharacter class in Listing 5.6. Figure 6.8. The chars array stores 100 characters, and the counts array stores 26 counts, each of which counts the occurrences of a letter.
|
2. | Count the occurrences of each letter in the array. To count the occurrences of each letter in the array, create an array, say counts , of twenty-six int values, each of which counts the occurrences of a letter, as shown in Figure 6.8. That is, counts[0] counts the number of a 's, counts[1] counts the number of b 's, and so on. Figure 6.9 shows a sample run of the program. Figure 6.9. The program generates one hundred lowercase letters randomly and counts the occurrences of each letter.(This item is displayed on page 184 in the print version)
|
1 public class CountLettersInArray { 2 /** Main method */ 3 public static void main(String args[]) { 4 // Declare and create an array 5 char [] chars = createArray(); 6 7 // Display the array 8 System.out.println( "The lowercase letters are:" ); 9 displayArray(chars); 10 11 // Count the occurrences of each letter 12 int [] counts = countLetters(chars); 13 14 // Display counts 15 System.out.println(); 16 System.out.println( "The occurrences of each letter are:" ); 17 displayCounts(counts); 18 } 19 20 /** Create an array of characters */ 21 public static char [] createArray() { 22 // Declare an array of characters and create it 23 char [] chars = new char [ 100 ]; 24 25 // Create lowercase letters randomly and assign 26 // them to the array 27 for ( int i = ; i < chars.length; i++) 28 chars[i] = RandomCharacter.getRandomLowerCaseLetter(); 29 30 // Return the array 31 return chars; 32 } 33 34 /** Display the array of characters */ 35 public static void displayArray( char [] chars) { 36 // Display the characters in the array 20 on each line 37 for ( int i = ; i < chars.length; i++) { 38 if (( i + 1 ) % 20 == ) 39 System.out.println(chars[i] + " " ); 40 else 41 System.out.print(chars[i] + " " ); 42 } 43 } 44 45 /** Count the occurrences of each letter */ 46 public static int [] countLetters( char [] chars) { 47 // Declare and create an array of 26 int 48 int [] counts = new int [ 26 ]; 49 50 // For each lowercase letter in the array, count it 51 for ( int i = ; i < chars.length; i++) 52 counts[chars[i] - 'a' ]++; 53 54 return counts; 55 } 56 57 /** Display counts */ 58 public static void displayCounts( int [] counts) { 59 for ( int i = ; i < counts.length; i++) { 60 if ((i + 1 ) % 10 == ) 61 System.out.println(counts[i] + " " + ( char )(i + 'a' )); 62 else 63 System.out.print(counts[i] + " " + ( char )(i + 'a' ) + " " ); 64 } 65 } 66 } |
The createArray method (lines 21 “32) generates an array of one hundred random lowercase letters. Line 5 invokes the method and assigns the array to chars . What would be wrong if you rewrote the code as follows ?
char [] chars = new char [ 100 ]; chars = createArray();
You would be creating two arrays. The first line would create an array by using new char[100] . The second line would create an array by invoking createArray() and assign the reference of the array to chars . The array created in the first line would be garbage because it is no longer referenced. Java automatically collects garbage behind the scenes. Your program would compile and run correctly, but it would create an array unnecessarily.
Invoking getRandomLowerCaseLetter() (line 28) returns a random lowercase letter. This method is defined in the RandomCharacter class in Listing 5.6.
The countLetters method (lines 46 “55) returns an array of twenty-six int values, each of which stores the number of occurrences of a letter. The method processes each letter in the array and increases its count by one. A brute-force approach to count the occurrences of each letter might be as follows:
for ( int i = ; i < chars.length; i++) if (counts[chars[i] == 'a' ) count[ ]++; else if (counts[chars[i] == 'b' ) count[ 1 ]++; ...
But a better solution is given in lines 51 “52.
for ( int i = ; i < chars.length; i++) counts[chars[i] - 'a' ]++;
If the letter ( chars[i] ) is 'a' , the corresponding count is counts['a' - 'a'] (i.e., counts[0] ). If the letter is 'b' , the corresponding count is counts['b' - 'a'] (i.e., counts[1] ), since the Unicode of 'b' is one more than that of 'a' . If the letter is 'z' , the corresponding count is counts['z' - 'a'] (i.e., counts[25] ), since the Unicode of 'z' is 25 more than that of 'a' .
Figure 6.10 shows the call stack and heap during and after executing createArray . See Review Question 6.14 to show the call stack and heap for other methods in the program.