King113 King113 - 2 months ago 7
Java Question

Incorrect calculation of character percent occurrence in a string (java)

My code takes a string, counts how many times each character of the alphabet appears in the string, and then displays a histogram of the array with the percentage info of how many times the character occurred in the string.

Im having problems with my code not displaying the correct percentage for each character that occurs in the string, it's off by a couple percentage points.

For example if I input "hello world", L should make up 30% of the string, right? But my code is saying it makes up 27% of the string. Im not quite sure if it's a code problem or a calculation problem

public class LetterCounter {
private static int[] alphabetArray;
private static char ch;
double stringLength;



/**
* Creates an array to hold the total number of occurences for each character of the alphabet
*/
public LetterCounter()
{
alphabetArray = new int[26];
}

/**
* The method will go through the user inputted string, incrementing characters one by one
* when it comes across them in the string.
* @param input: the string that the user wants
*/
public void countLetters(String input) {
String userInput= input;
String s2 = userInput.toLowerCase();
for ( int i = 0; i < s2.length(); i++ ) {
char ch= s2.charAt(i);
if (ch >= 97 && ch <= 122){
alphabetArray[ch-'a']++;
}
}
stringLength = s2.length();
}

/**
* Calculates how many characters there are in the inputted string. Multiple strings that are input by the user will be
* added to the total character count.
* @return: the sum of how many characters there are in each string
*/
public int getTotalCount() {
int sum=0;
for (int i = 0; i < alphabetArray.length; i++) {
if(alphabetArray[i]>=0){
sum = 0;
char ch = (char) (i+97);
for(int total : alphabetArray) {
sum += total;
}
}

}
return sum;
}

/**
* This method will reset the character count to zero for every character.
*/
public void reset() {
for (int i : alphabetArray) {
if(alphabetArray[i]>=0){
alphabetArray[i]=0;
char ch = (char) (i+97);
System.out.println(ch +" : "+alphabetArray[i]);
}
}
}

/**
* The method prints out a histogram of the entire array, displaying the most commonly occuring letter as having 60 #s,
* with the rest of the letter's #s to the 60 #s. The percentage occurence of each character in the string is also displayed beside the character.
* @return: the histogram of the array
*/
public String toString() {
int max = alphabetArray[0];
int markCounter = 0;
double percent = 0.0;
String s = "";

for(int i =0; i<alphabetArray.length; i++) {
//finds the largest number of occurences for any letter in the string
if(alphabetArray[i] > max) {
max = alphabetArray[i];
}
}

for (int i = 0; i < alphabetArray.length; i++) {
//percent = (alphabetArray[i] /stringLength) * 100;
percent = Math.round((alphabetArray[i] /stringLength ) * 100);
markCounter = (alphabetArray[i] * 60) / max;
if(alphabetArray[i]>=0){
char ch = (char) (i+97);
System.out.print(ch +" : ");
}

for (int hash =0; hash <markCounter; hash++) {
System.out.print("#");

}

if(alphabetArray[i] >= 0){
System.out.print(" " + percent + "%"); //+ percent);

}
System.out.println();

}

return s;
}
}

Answer

You are using string.length() function to calculate the length of string. This function calculates the space in the string length too. I guess you are trying to calculate the percentage in respect to total char's available in string.

You will need to count the string length in the loop, in which you are checking for the frequency of each char's.

public void countLetters(String input) {
    String userInput= input; 
    String s2 = userInput.toLowerCase();
    for ( int i = 0; i < s2.length(); i++ ) {
        char ch=  s2.charAt(i);
        if (ch >= 97 && ch <= 122){
            alphabetArray[ch-'a']++;
            stringLength++; 
        }
    }

}

This way you will get the total number of char in the string.

Also, You might also want to make sure whether to want to include the char's other than alphabets. Special char's can also be part of string. Depending on your requirement stringlength counter will update.