Search code examples
javastringwhile-loopchar

Counting matching characters on a string


I have been asked to created a program that asks the user for two inputs, both of which have to be stored as strings. The first input can be one or multiple words, and the second input has to be one sole character. After the user enters both inputs the program should count how many times, if any, the sole charter appears in the first string. Once the iteration through the first string is done the program should then output the number of instances of the second string. Example:

"There is 1 occurrence(s) of 'e' in test."

The program must use the a while loop and string values. This is the solution I have as of right now following the parameters established by the professor

public static void main(String[] args) {
        String inputEntry; // User's word(s)
        String inputCharacter; // User's sole character
        String charCapture; // Used to create subtrings of char
        int i = 0; // Counter for while loop
        int charCount = 0; // Counter for veryfiying how many times char is in string
        int charCountDisplay = 0; // Displays instances of char in string
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter some words here: "); // Captures word(s)
        inputEntry = scan.nextLine(); 

        System.out.print("Enter a character here: "); // Captures char
        inputCharacter = scan.nextLine();

        if (inputCharacter.length() > 1 ||  inputCharacter.length() < 1) // if user is not in compliance
        {
            System.out.print("Please enter one character. Try again.");
            return; 
        } 
         else if (inputCharacter.length() == 1) // if user is in compliance
         {
          while( i < inputEntry.length()) // iterates through word(s)
           {
              charCapture = inputEntry.substring(charCount); // Creates substring of each letter in order to compare to char entry
                    if (charCapture.equals(inputCharacter))
                    {
                        ++charCountDisplay;

                    }

                    ++charCount;  
                    ++i;
            }

          System.out.print("There is " + charCountDisplay + 
                  " occurrence(s) of " + inputCharacter + " in the test.");

         }



        }

This iteration has a bug. Instead of counting all the instances of the inputCharacter variable it only counts up to one, regardless of how many instances appear on the string. I know the problem is in this part of the code:

while( i < inputEntry.length()) // iterates through word(s)
           {
              charCapture = inputEntry.substring(charCount); // Creates substring of each letter in order to compare to char entry
                    if (charCapture.equals(inputCharacter))
                    {
                        ++charCountDisplay;

                    }

                    ++charCount;  
                    ++i;
            }

I just can't quiet pin down what I'm doing wrong. It seems to me that the charCountDisplay variable reverts to zero after each iteration. Isn't that supposed to be avoided by declaring the variable at the very beginning?... I'm one confused fellow.


Solution

  • This is wrong

    charCapture = inputEntry.substring(charCount);
    

    does not return one char

    try using inputEntry.charAt(charCount)

    Another hint is to define your variables close to where you use them rather than at the top of your method like:

    String inputEntry; 
    inputEntry = scan.nextLine(); 
    

    Even better would be to do inline

    String inputEntry = scan.nextLine(); 
    

    It will make your code a lot more concise and readable.

    A more concise way to do your code is:

    Scanner scan = new Scanner(System.in);
    
    System.out.print("Enter some words here: "); // Captures word(s)
    String inputEntry = scan.nextLine(); 
    
    System.out.print("Enter a character here: "); // Captures char
    String inputCharacter = scan.nextLine();
    
    // validate
    
    // then
    
    int len = inputEntry.length();
    inputEntry = inputEntry.replace(inputCharacter, "");
    int newlen = inputEntry.length();
    System.out.format("There is %d occurrence(s) of %s in the test.%n", 
                                                len - newlen, inputCharacter);
    

    output

    Enter some words here: scarywombat writes code
    Enter a character here: o
    There is 2 occurrence(s) of o in the test.