Learning Java in 2020 – Beginner – Count Vowels

Overview reference

Problem

Goal

Count the number of vowels in a given text and provide a report of how many times a specific vowel occurred in the text.

Pseudo-code

Count Vowels

• Get user input
• Declare a count variable and initialize with 0
• Loop through text
• Check if each character is a vowel
• If vowel, increase count value
• Print out count

Generate Vowel Occurrence Report

• Get user input
• Create a count variable for each vowel and set them each to 0
• Loop through text
• Check if each character is a vowel
• If vowel, increase corresponding vowel count variable by 1
• Print out report

Solution

Check is vowel

```private static boolean characterisvowel(char character) {
String vowels = "aeiou";
boolean isvowel = false;
if(vowels.indexOf(character) >= 0) {
isvowel = true;
}

return isvowel;
}
```

Unlike the Pig latin exercise,an alternative approach is taken in this characterisvowel method. Instead of looping through the vowels variable “aeiou” and comparing the argument against each character ,the occurrence of the argument is determined in the vowels variable using the String.indexOf method. With an index >= 0, true is returned, else false is returned.

Count vowels in text

```private static int countVowelsPerWord(String word) {
int count = 0;
for(int i = 0; i < word.length(); i++) {
char current_char = word.charAt(i);
if(CountVowels.characterisvowel(current_char)) {
count += 1;
}
}
return count;
}```

As already stated in the pseudo-code section,the count variable is incremented by 1 each time a character in the given String is a vowel.

Generate vowel occurrence report

Coming from javascript, I thought of using the datatype object or dictionary in python. So I searched “object or dictionary in java” with hopes of finding a data type, with which data could be stored in a key -> value format.

Such actually exist but it is called HashMap. According to this article, it is a Map based collection used to store key and value pairs. Exactly what was needed.

Steps

• Loop through each character in the given string
• Check if character already exists as a key in the hashmap instance
• If it does, simply increment its value by 1
• Else, I check if it is a vowel
• If it is a vowel, a new key -> value pair is added
• the key is set to the current character and the value to 0.
• Loop through key-> value pair of the hashmap instance
• A report text is generated usings the key and value pair
• Return report text
```private static String generatevowelreport(String text) {
String report_text = "Here is your vowel report: \n";
HashMap<Character, Integer> report = new HashMap<Character, Integer>();

for(int i = 0; i < text.length(); i++) {
char current_char = text.charAt(i);
if(report.containsKey(current_char)) {
int newnumber = report.get(current_char);
newnumber += 1;
report.put(current_char, newnumber);
}
else if(CountVowels.characterisvowel(current_char)) {
report.put(current_char, 1);
}
}

for(Map.Entry<Character, Integer> eachvowel : report.entrySet()) {
char vowel = eachvowel.getKey();
int value = eachvowel.getValue();
report_text += vowel +  " occurs " + value + " times \n";
}
return report_text;
}
```

Trigger Action

Anyone following my learning programming with -> java should immediately recognize this snippet. This just obtains input from the user till he/she presses Enter. Then counts the number of vowels, generates a vowel occurrence report and prints out the result.

```public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String text = sc.nextLine();
int numberofvowels = CountVowels.countVowelsPerWord(text);
String vowelreport = CountVowels.generatevowelreport(text);

System.out.println("The number of vowels in your text above is : " + numberofvowels);
System.out.println(vowelreport);
}```

Run Program

```C:<path>\com.learnjava\src\com\learnjava\beginner>java CountVowels.java
person in a life of crisis
The number of vowels in your text above is : 9
a occurs 1 times
e occurs 2 times
i occurs 4 times
o occurs 2 times```

CountVowels.java

```package com.learnjava.beginner;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class CountVowels {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String text = sc.nextLine();
int numberofvowels = CountVowels.countVowelsPerWord(text);
String vowelreport = CountVowels.generatevowelreport(text);

System.out.println("The number of vowels in your text above is : " + numberofvowels);
System.out.println(vowelreport);
}

private static int countVowelsPerWord(String word) {
int count = 0;
for(int i = 0; i < word.length(); i++) {
char current_char = word.charAt(i);
if(CountVowels.characterisvowel(current_char)) {
count += 1;
}
}
return count;
}
private static boolean characterisvowel(char character) {
String vowels = "aeiou";
boolean isvowel = false;
if(vowels.indexOf(character) >= 0) {
isvowel = true;
}

return isvowel;
}

private static String generatevowelreport(String text) {
String report_text = "Here is your vowel report: \n";
HashMap<Character, Integer> report = new HashMap<Character, Integer>();

for(int i = 0; i < text.length(); i++) {
char current_char = text.charAt(i);
if(report.containsKey(current_char)) {
int newnumber = report.get(current_char);
newnumber += 1;
report.put(current_char, newnumber);
}
else if(CountVowels.characterisvowel(current_char)) {
report.put(current_char, 1);
}
}

for(Map.Entry<Character, Integer> eachvowel : report.entrySet()) {
char vowel = eachvowel.getKey();
int value = eachvowel.getValue();
report_text += vowel +  " occurs " + value + " times \n";
}
return report_text;
}
}
```

Question

How would you create a “vowels” report of a text file ?